加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:56:59 所属栏目:百科 来源:网络整理
导读:给出以下方法: public async TaskMyObject DoSomethingAsync() { // do some work await OpenSomeFileAsync(); return new MyObject();} 是否有区别: public async void SomeEventHandler(EventArgs args) { var myObject = await await Task.Factory.Star
给出以下方法:
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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读