CSharp - 等待 AsyncMethod() 等待等待 Task.Factory.StartNew <TResult> ( AsyncMethod )

  显示原文与译文双语对照的内容
0 0

给定以下方法:


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会立即在一个新的任务中发生,但是我并不真正理解任务,异步和等待是如何工作的,我很肯定我是overcomplicating的事情。

编辑:

这个问题来自于这个地铁的例子: 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并执行异步函数。

时间: 原作者:

0 0

大多数时候,添加另一个 Task的NOT 很有用,但是在某些情况下,它可以。

如果你位于UI线程( 或者类似的东西) 上并直接执行 DoSomethingAsync(),那么它的第一部分是 //do some work ) 也将在UI线程上执行,因此方法( 除非他们使用 ConfigureAwait() )的任何延续部分也将执行。 另一方面,如果启动另一个 Task,那么 DoSomethingAsync()的第一部分和下面的任何部分都将在 ThreadPool 上执行。

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

另外,你可以编写以下命令,而不是使用 Task.Factory.StartNew() 和两个 await:


await Task.Run(DoSomethingAsync);

原作者:
0 0

是的有区别: 在第一种形式中,你有一个额外的任务级别,这绝对没有。

第一个表单基本上等效于:


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

所以 NOT 确实有意义: 你正在创造一个任务。 创建另一个任务。

原作者:
...