c# – 等待AsyncMethod()与等待await Task.Factory.StartNew(AsyncMethod)

前端之家收集整理的这篇文章主要介绍了c# – 等待AsyncMethod()与等待await Task.Factory.StartNew(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和等待工作的全部,我很漂亮肯定我只是为了我自己的事情过于复杂.

编辑:

这个问题来自于这个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);
原文链接:https://www.f2er.com/csharp/93258.html

猜你在找的C#相关文章