首页 / C# / c#-什么时候多次等待才有意义?
c#-什么时候多次等待才有意义?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-什么时候多次等待才有意义?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1548字,纯文字阅读大概需要3分钟。
内容图文
我对C#异步/等待机制有一些误解.
两者之间有本质区别吗
private async void Init()
{
await Task.Run(() => Do1());
await Task.Run(() => Do2());
}
和
private async void Init()
{
await Task.Run(() =>
{
Do1();
Do2();
});
}
我看到的唯一区别是:在第一个示例中,Do1和Do2将在不同的线程中运行,而在第二个示例中,将在同一线程中运行.但是,它的真正好处是什么?何时我应该比第一种方法更喜欢第一种方法,反之亦然?
编辑:第二种情况
之间有什么区别
private async void Init()
{
await Task.Run(() => Do1());
Do3();
}
和
private async void Init()
{
await Task.Run(() =>
{
Do1();
Do3();
});
}
解决方法:
区别在于:
第一个例子:
>将Do1放在线程池线程上并异步等待它完成,然后对Do2进行完全相同的操作.这些可以在不同的线程上运行.
>将Do1和Do2排队,以便在同一线程池线程上一个接一个地同步执行.
第二个例子:
>在线程池上将Do1排队,并异步等待其完成,然后同步调用Do3.
>这与第一个示例的第二部分完全相同.
请注意,当您等待时,您将异步地等待操作完成,因此,除非该方法完成,否则它将不会执行下一行代码.
我假设您是在问自己一个人是否比另一个人更可取,并且在大多数情况下,这取决于情况.如果您正在控制台应用程序中运行,并且无论如何都要异步等待Do1完成,则将这两个方法传递给相同的Task.Run调用.如果您打算在同步很重要的地方(例如GUI应用程序)执行此操作,则需要在UI线程上调用任何需要与UI控件交互的操作.
另一个更常见的选择是,当您有两个彼此独立的操作,并且想要一起启动它们并等待两者完成时.在这里使用Task.WhenAll:
var firstDo = Task.Run(() => Do1());
var secondDo = Task.Run(() => Do2());
await Task.WhenAll(firstDo, secondDo);
边注:
不要在没有返回值的异步方法中使用异步void,这就是异步Task的目的.前者仅是为了允许与事件处理程序兼容,在此我假设情况并非如此.
内容总结
以上是互联网集市为您收集整理的c#-什么时候多次等待才有意义?全部内容,希望文章能够帮你解决c#-什么时候多次等待才有意义?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。