在目标方法要调用基于事件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的使用场景