首页 > 解决方案 > c# 编写一个没有等待的异步方法

问题描述

我想async在我的调用中有一个方法,该方法将由我的库使用者使用await. 但是我的方法的内部工作,虽然我需要它在单独的线程上运行,但它自己不会调用任何其他线程await

我只是做该方法应该做的工作并返回类型。编译器警告我这个方法不会以异步方式运行。

public async Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return result;
}

另一方面,如果我编写一个使用 TaskFactory 启动新任务的方法,如下所示:

public Task<MyResultObject> DoSomeWork()
{
     return Task<MyResultObject>.Factory.StartNew(() =>
     {
         MyResultObject result = new MyResultObject();
         // Some work to be done here

         return result;
     });
}

然后我不能使用这样的await关键字来调用它await DoSomeWork()

如何在async不使用内部调用的情况下编写(必须是异步的,而不是带有结果或等待的任务)await

标签: c#asynchronousasync-awaittask-parallel-library

解决方案


你可以这样做

public Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return Task.FromResult(result);
}

这与

public async Task<MyResultObject> DoSomeWork()
{
     MyResultObject result = new MyResultObject();
     // Some work to be done here

     return result;
}

只有这个版本会发出警告,并且开销稍大。

但两者都不会在另一个线程上运行。唯一的好处是它们有一个可等待的接口。

要并行执行,您的代码还可以,但 Task.Run 优于 StartNew():

public Task<MyResultObject> DoSomeWork()
{
     return Task.Run(() =>
     {
         MyResultObject result = new MyResultObject();
         // Some work to be done here

         return result;
     });
}

在所有这些情况下,您绝对可以await DoSomeWork()


推荐阅读