繁体   English   中英

await AsyncMethod()与await await Task.Factory.StartNew <TResult> (异步方法)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM