相关疑难解决方法(0)

创建一个完成的任务

我想创建一个完整的Task(不是Task<T>)..NET中是否有内置功能可以执行此操作?

相关问题: 创建已完成的任务<T>

.net c# task-parallel-library async-await

181
推荐指数
7
解决办法
7万
查看次数

如何实现返回Task <T>的接口方法?

我有一个界面

interface IFoo
{
  Task<Bar> CreateBarAsync();
}
Run Code Online (Sandbox Code Playgroud)

有两种方法可以创建Bar,一种是异步,另一种是同步.我想为这两种方法中的每一种提供接口实现.

对于异步方法,实现可能如下所示:

class Foo1 : IFoo
{
  async Task<Bar> CreateBarAsync()
  {
    return await AsynchronousBarCreatorAsync();
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我该如何实现Foo2使用同步方法创建的类Bar

可以实现同步运行的方法:

  async Task<Bar> CreateBarAsync()
  {
    return SynchronousBarCreator();
  }
Run Code Online (Sandbox Code Playgroud)

然后,编译器将警告不要async在方法签名中使用:

这种异步方法缺少"等待"运算符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.

或者,我可以实现显式返回的方法Task<Bar>.在我看来,代码看起来不那么可读:

  Task<Bar> CreateBarAsync()
  {
    return Task.Run(() => SynchronousBarCreator());
  }
Run Code Online (Sandbox Code Playgroud)

从性能的角度来看,我认为这两种方法的开销大致相同,或者?

我应该选择哪种方法; async同步实现方法或显式包装同步方法调用Task

编辑

我正在开发的项目实际上是一个.NET 4项目,其中包含来自Microsoft Async NuGet包的async/await扩展.在.NET 4上,可以替换为.我有意识地在上面的例子中使用了.NET 4.5方法,希望能让主要问题更加清晰.Task.RunTaskEx.Run

.net c# asynchronous task-parallel-library async-await

38
推荐指数
4
解决办法
9753
查看次数