C# · 12月 27, 2021

c# – 等待AsyncMethod()与等待await Task.Factory.StartNew(AsyncMethod)

给出以下方法: public async Task<MyObject> DoSomethingAsync() { // do some work await OpenSomeFileAsync(); return new MyObject();}

是否有区别:

public async void SomeEventHandler(EventArgs args) { var myObject = await await Task.Factory.StartNew<Task<MyObject>>( DoSomethingAsync); // do something with myObject}

和:

public async void SomeEventHandler(EventArgs args) { var myObject = await DoSomethingAsync(); // do something with myObject}

在第一种情况下,我正在认为DoSomethingAsync的“做一些工作”的一部分会立即发生在一个新的任务中,但老实说,我完全不了解Tasks,async和等待工作的全部,我很漂亮肯定我只是为了我自己的事情过于复杂.

编辑:

这个问题来自于这个Metro例子:
http://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782

具体在MainPage.xaml.cs中,他们有:

var unused = Task.Factory.StartNew(async () => { // some work… });// unused is of type Task<TResult>

我试图重做它,而不使用匿名异步功能,我开始怀疑,为什么不只是写一个异步方法,等待它,而不是调用StartNew和处理异步功能?

解决方法@H_419_27@ 大多数时候,添加另一个任务是没有用的,但在某些情况下,它可以是.

不同的是如果你在UI线程(或类似的东西)上直接执行DoSomethingAsync(),它的第一部分(//做一些工作)也将在UI线程上执行,所以方法的任何继续部分(除非他们使用ConfigureAwait()).另一方面,如果您启动另一个任务,DoSomethingAsync()的第一部分和任何以下部分将在ThreadPool上执行.

如果DoSomethingAsync()正确写入,添加另一个Task不应该给你任何优势(并且会给你更多的开销的缺点),但是我可以想象有些情况会有所改变.

另外,而不是使用Task.Factory.StartNew()和两个等待,你可以写:

await Task.Run(DoSomethingAsync);