c# 编写一个没有等待的异步方法

c# Writing an async method that doesn't have an await in it

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

我只做方法应该做的工作和 return 类型。编译器警告我该方法不会以异步方式运行。

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()

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

你可以做到

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()