如何从已经异步的代码创建任务?

xtr*_*var 4 c# asynchronous task-parallel-library

我有一些已经异步的代码 - 只是不使用Task系统.如果可能的话,我想使它成为一个轻量级的任务,以便代码可以将其用作任务.

所以我想接受这个:

void BeginThing(Action callback);
Run Code Online (Sandbox Code Playgroud)

并把它变成这个伪代码:

Task MyBeginThing() {
   Task retval = // what do I do here?
   BeginThing(() => retval.Done())
   return retval;
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?我不想使用互斥锁和其他线程作为解决方案.

Mik*_*ray 14

用途TaskCompletionSource:

Task MyBeginThing() {
   var taskSource = new TaskCompletionSource<object>();
   BeginThing(() => taskSource.SetResult(null));
   return taskSource.Task;
}
Run Code Online (Sandbox Code Playgroud)

对于使用事件来指示异步完成的API,这也很常见.如果它是旧学校的开始/结束异步对(也称为异步编程模型或APM)TaskFactory.FromAsync也很有用.