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

标签 c# asynchronous task-parallel-library

我有一些代码已经是异步的——只是没有使用任务系统。如果可能的话,我想让它成为一个轻量级的任务,这样代码就可以将它作为一个任务来利用。

所以我想拿这个:

void BeginThing(Action callback);

然后把它变成这个伪代码:

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

这可能吗?我不想使用互斥锁和另一个线程作为解决方案。

最佳答案

使用TaskCompletionSource :

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

这对于调整使用事件来表示异步完成的 API 来说也很常见。如果它是老式的 Begin/End 异步对(也称为异步编程模型或 APM)TaskFactory.FromAsync也很有用。

关于c# - 如何从已经异步的代码创建任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903002/

相关文章:

c# - 正则表达式拆分逗号分隔的大括号,应该很简单

c# - 对多个连接使用 Socket.BeginAccept/EndAccept

javascript - 如何从异步调用返回响应?

c# - 如何使用 TPL 数据流库指定无序执行 block ?

c# - 并行处理 - 管理父/子依赖关系

c# - 标签在 ASP.NET 页面的当前上下文中不存在

c# - 如何使用 C# 访问网络摄像头?

c# - 公开可取消任务 API 的正确方法

c# - 在 C# 中向 Windows 8 Metro 风格应用程序发送推送通知

python - 有没有办法从Python调用Rust的异步接口(interface)?