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 restore/build在使用组织包的Github Action工作流中调用时获得401

使用EFCore.BulkExtensions库方法BulkInertOrUpdate时区分插入和更新的记录

从窗体中移除另一个控件中引用的控件时获取设计时通知

NET 6:控制器方法不可访问

如何在 NET 5 / 6 中使用 Direct3D11CaptureFramePool

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

Dictionary.FirstOrDefault() 如何判断是否找到了结果

如何在 C# 中自动删除临时文件?

既然 .NET 有一个垃圾收集器,为什么我们需要终结器/析构器/dispose-pattern?

在 C# 中将字符串转换为 colored颜色

如何获取控制台应用程序的执行目录

MongoDB C# 驱动程序 - 忽略绑定字段

不同命名空间中的部分类

在 .NET C# 中存储加密密钥的最佳方式

找不到 Microsoft.Office.Interop Visual Studio

如何通过 LINQ 比较没有时间的 DateTime?

在 .NET 中填充整数列表

并发字典正确用法

对构造函数进行单元测试重要吗?

任何人都知道缺少枚举通用约束的好方法吗?