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

时间:2019-01-03 12:42:22

标签: c# asynchronous async-await task-parallel-library

我想在我的调用中使用一个 npm run build 方法,该方法由我的库使用者使用async调用。但是,尽管我的方法需要在单独的线程上运行,但它的内部工作并不自行调用其他任何await

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

await

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

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

     return result;
}

然后我不能使用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(必须异步并且不执行结果或等待任务)?

1 个答案:

答案 0 :(得分:0)

您可以做到

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