AFAIK,它所知道的就是在某个时刻,它的SetResultSetException方法被调用,以完成通过其Task属性公开的Task<T>.

换言之,它充当了a Task<TResult>及其完成的制作人.

我看到了here个例子:

如果我需要一种方法来异步执行一个Func<T>,并有一个Task<T>

public static Task<T> RunAsync<T>(Func<T> function) 
{ 
    if (function == null) throw new ArgumentNullException(“function”); 
    var tcs = new TaskCompletionSource<T>(); 
    ThreadPool.QueueUserWorkItem(_ => 
    { 
        try 
        {  
            T result = function(); 
            tcs.SetResult(result);  
        } 
        catch(Exception exc) { tcs.SetException(exc); } 
    }); 
    return tcs.Task; 
}

如果我没有Task.Factory.StartNew的话可以用-

Question:

有人能举例说明与directlyTaskCompletionSource有关的场景吗

推荐答案

我主要在只有基于事件的API可用时使用它(for example Windows Phone 8 sockets):

public Task<Args> SomeApiWrapper()
{
    TaskCompletionSource<Args> tcs = new TaskCompletionSource<Args>(); 

    var obj = new SomeApi();

    // will get raised, when the work is done
    obj.Done += (args) => 
    {
        // this will notify the caller 
        // of the SomeApiWrapper that 
        // the task just completed
        tcs.SetResult(args);
    }

    // start the work
    obj.Do();

    return tcs.Task;
}

因此,当与C#5 async关键字一起使用时,它尤其有用.

.net相关问答推荐

ASP.NET核心最小API必须以正斜杠开头吗?

为什么 ULong > 16 位的数学会变得不稳定?

如何在 ASP.NET Core MVC 中读取操作方法的属性?

在 C# 中生成随机小数

在 .NET 中获取执行 exe 路径的最佳方法是什么?

为什么 StyleCop 建议在方法或属性调用前加上this?

我可以从 .NET/C# 获取其他进程的命令行参数吗?

如何在 C# 中打开 Excel 文件?

返回 IQueryable 或不返回 IQueryable

(C# 7.2)私有保护修饰符的用例是什么?

处理序列没有元素异常

使用 C# 在 .NET 4.0 中 Task.Run 的替代方法是什么?

将接收到的对象转换为 List 或 IEnumerable

在 C# 中与块等效?

SQLParameter 如何防止 SQL 注入?

C#中的引用类型

使用 XmlDocument 读取 XML 属性

DLL 中有什么以及它是如何工作的?

为什么 !0 是 Microsoft 中间语言 (MSIL) 中的一种类型?

LINQ 可以与 IEnumerable 一起使用吗?