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相关问答推荐

如何在 NET 5 / 6 中使用 Direct3D11CaptureFramePool

信号量的多线程问题

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

什么取代了 .Net Core 中的 WCF?

WPF中的依赖属性和附加属性有什么区别?

.net Core 2.0 - 使用 .NetFramework 4.6.1 而不是目标框架 .netCore 2.0 恢复了包.软件包可能不完全兼容

if (false == true) 在内部抛出异常时执行块

如何卸载“Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1”?

在 .NET Core RC2 中构建 .exe 文件

InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务

如何根据新的安全策略在 .Net 中发送邮箱?

如何使我的托管 NuGet 包支持 C++/CLI 项目?

/langversion 的错误选项“6”无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

将 C# 编译为本机?

Visual Studio 2015 中的共享项目和类库有什么区别?

HttpClient 和使用代理 - 不断得到 407

使用给定的 DateTime 对象获取一个月的第一天和最后一天

将 SignalR 2.0 .NET 客户端重新连接到服务器集线器的最佳实践

为什么 HttpClient BaseAddress 不起作用?

从数据读取器填充数据表