TaskCompletionSource使用

在目标方法要调用基于事件API,又要返回Task的时候使用。

比如下面的ApiWrapper方法,该方法要返回Task,又要调用EventClass对象的Do方法,并且等到Do方法触发Done事件后,Task才能得到结果并返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void test()
{
var task = ApiWrapper();

Console.WriteLine("Test CurrentThread:" + Thread.CurrentThread.ManagedThreadId);

Console.WriteLine(task.Result);
}

private static Task<string> ApiWrapper()
{
var tcs = new TaskCompletionSource<string>();

var api = new EventClass();
api.Done += (args) => { tcs.TrySetResult(args); };
api.Do();

return tcs.Task;
}

public class EventClass
{
public Action<string> Done = (args) => {; };

public void Do()
{
Console.WriteLine("EventClass" + Thread.CurrentThread.ManagedThreadId);
Done("Done");
}
}

参考:

TaskCompletionSource Class

什么时候应该使用TaskCompletionSource

TaskCompletionSource的使用场景