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()
我想在我的调用中有一个 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()