[英]await Task.Factory.StartNew(() => versus Task.Start; await Task;
[英]await AsyncMethod() versus await await Task.Factory.StartNew<TResult>(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和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<TResult>
我试图在不使用匿名异步函数的情况下进行重做,然后开始思考,为什么不编写一个异步方法并等待它,而不是调用StartNew并提交一个异步函数?
在大多数情况下,添加另一个Task
没有用,但是在某些情况下可以。
区别在于,如果您在UI线程(或类似的线程)上并直接执行DoSomethingAsync()
,它的第一部分( // do some work
)也将在UI线程上执行,因此该方法的任何后续部分也将执行(除非他们使用ConfigureAwait()
)。 另一方面,如果您启动另一个Task
,则DoSomethingAsync()
的第一部分和随后的任何部分都将在ThreadPool
上执行。
如果正确编写了DoSomethingAsync()
,则添加另一个Task
不会给您带来任何好处(并且会给您带来更多开销的缺点),但是我可以想象在某些情况下它会有所作为。
另外,可以使用以下Task.Factory.StartNew()
代替使用Task.Factory.StartNew()
和两个await
:
await Task.Run(DoSomethingAsync);
是的,这是有区别的:在第一种形式中,您有一个额外的任务级别,它绝对没有带来任何用处。
第一种形式基本上等效于此:
Task<Task<MyObject>> task1 = Task.Factory.StartNew<Task<MyObject>>( DoSomethingAsync);
Task<MyObject>> task2 = await task1;
var myObject = await task2;
因此,这实际上没有任何意义:您正在创建的任务仅仅是...创建另一个任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.