给出以下方法:
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和处理异步功能?
解决方法
大多数时候,添加另一个任务是没有用的,但在某些情况下,它可以是.
不同的是如果你在UI线程(或类似的东西)上直接执行DoSomethingAsync(),它的第一部分(//做一些工作)也将在UI线程上执行,所以方法的任何继续部分(除非他们使用ConfigureAwait()).另一方面,如果您启动另一个任务,DoSomethingAsync()的第一部分和任何以下部分将在ThreadPool上执行.
如果DoSomethingAsync()正确写入,添加另一个Task不应该给你任何优势(并且会给你更多的开销的缺点),但是我可以想象有些情况会有所改变.
另外,而不是使用Task.Factory.StartNew()和两个等待,你可以写:
await Task.Run(DoSomethingAsync);