c# – TPL异步等待 – 异步任务是否必须链接调用堆栈?
发布时间:2020-12-15 22:12:12 所属栏目:百科 来源:网络整理
导读:我的理解是,以下是不好的做法,因为它会阻塞线程: Task t = Task.Run(() = MyMethod());t.Wait(); 虽然以下内容不会阻止该主题: await MyMethod(); 但是,要使用await,必须在方法签名中使用async关键字,并返回Task而不是void,或Task T. 但是,在n层应用程序中
我的理解是,以下是不好的做法,因为它会阻塞线程:
Task t = Task.Run(() => MyMethod()); t.Wait(); 虽然以下内容不会阻止该主题: await MyMethod(); 但是,要使用await,必须在方法签名中使用async关键字,并返回Task而不是void,或Task< T>. 但是,在n层应用程序中,如果你有一个巨大的调用堆栈,那么我们必须让每个调用方法都是async / Task,如LinqPad的以下简单示例所示: async void Main() { int i = await GetNumberD(); i.Dump(); } async Task<int> GetNumberD() { return await GetNumberC(); } async Task<int> GetNumberC() { return await GetNumberB(); } async Task<int> GetNumberB() { return await GetNumberA(); } async Task<int> GetNumberA() { await Task.Delay(TimeSpan.FromSeconds(1)); return 7; } 解决方法
是的,如果在堆栈末尾调用的方法是异步方法. 请注意,文档建议使用“Async”后缀结束方法的名称: async Task<int> GetNumberAsync() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |