小编典典

TaskCompletionSource何时应 使用?

c#

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

换句话说,它充当a Task<TResult>及其完成的生产者。

我在 这里 看到了示例:

如果我需要一种异步执行Func并有一个Task来表示该操作的方法。

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-但我 确实Task.Factory.StartNew

题:

可有人请举例相关的情景解释 直接TaskCompletionSource 而不是一个 假想 中,我没有的情况
Task.Factory.StartNew


阅读 267

收藏
2020-05-19

共1个答案

小编典典

当仅基于事件的API可用时(例如Windows Phone 8套接字),我主要使用它:

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关键字一起使用时,它特别有用。

2020-05-19