小编典典

什么时候应该 TaskCompletionSource使用?

all

AFAIK,它所知道的是,在某些时候,它的SetResultorSetException方法被调用来完成Task<T>通过它的Task属性暴露。

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

我在 这里 看到了这个例子:

如果我需要一种方法来Func<T>异步执行 a 并有 aTask<T> 来表示该操作。

public static Task<T> RunAsync<T>(Func<T> function) 
{ 
    if (function == null) throw new ArgumentNullException(鈥渇unction鈥�); 
    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情况相关的场景吗?


阅读 87

收藏
2022-06-02

共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;
}

async因此,它与 C#5关键字一起使用时特别有用。

2022-06-02