等待AsyncMethod()与等待等待等待Task.Factory.StartNew (AsyncMethod)

给定以下方法:

public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync(); return new MyObject(); } 

是否有区别:

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

和:

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

我认为DoSomethingAsync的“做一些工作”部分会在第一种情况下立即发生在新任务中,但说实话我并不完全理解Task,async和await是如何工作的,而且我很漂亮确定我只是为自己过度复杂的事情。

编辑:

这个问题来自于查看这个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 

我试图在不使用匿名异步函数的情况下重做它,我开始想知道,为什么不写一个异步方法并等待它,而不是调用StartNew并交出一个异步函数?

大多数情况下,添加另一个Task没有用,但在某些情况下,它可以。

不同之处在于,如果您在UI线程(或类似的东西DoSomethingAsync()直接执行DoSomethingAsync() ,它的第一部分( // do some work )也将在UI线程上执行,因此该方法的任何继续部分也将执行(除非他们使用ConfigureAwait() )。 另一方面,如果你启动另一个TaskDoSomethingAsync()的第一部分和任何后续部分都将在ThreadPool上执行。

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

此外,您可以编写:而不是使用Task.Factory.StartNew()和两个await s,

 await Task.Run(DoSomethingAsync); 

是的,有一点不同:在第一种forms中,你有一个额外的任务级别,这绝对没有任何用处。

第一种forms基本上等同于:

 Task> task1 = Task.Factory.StartNew>( DoSomethingAsync); Task> task2 = await task1; var myObject = await task2; 

所以它没有意义:你创建的任务只是……创造另一个任务。