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

c# – 在循环中等待两件事?

发布时间:2020-12-15 23:30:42 所属栏目:百科 来源:网络整理
导读:我怎样才能同时等待两件或更多件事(不同类型)?就像在事件循环中一样: while(true) { Letter msg1 = await WaitForLetter(); //read msg1 and reply. SMS msg2 = await WaitForSMS(); //read msg2 and reply} 这看起来不对.这两条消息最终会互相阻塞? 解决
我怎样才能同时等待两件或更多件事(不同类型)?就像在事件循环中一样:

while(true) {
    Letter msg1 = await WaitForLetter();
    //read msg1 and reply.
    SMS msg2 = await WaitForSMS();
    //read msg2 and reply
}

这看起来不对.这两条消息最终会互相阻塞?

解决方法

目前,您的代码将等待每个方法依次完成.如果要发送每条消息然后在最后等待两者,则可以使用 Task.WaitAll方法(假设您的方法返回Task< T>对象.

while(true) {
    Task<Letter> msgTask1 = WaitForLetter();
    Task<SMS> msgTask2 = WaitForSMS();

    Task.WaitAll(msgTask1,msgTask2);
}

然后,您可以使用Result属性获取每个任务的结果(再次假设您的方法返回Task< T>:

Letter msg1 = msgTask1.Result;
SMS msg2 = msgTask2.Result;

当然,这一切都假设WaitForLetter和WaitForSMS的实现是独立的,不会相互阻塞.

如果您只想等待任何任务完成,您可以使用`Task.WaitAny’到同一目的.这将返回已完成的任务的索引,以便您知道哪一个已完成.

while(true) {
    Task<Letter> msgTask1 = WaitForLetter();
    Task<SMS> msgTask2 = WaitForSMS();

    var finishedTask = Task.WaitAny(msgTask1,msgTask2);
}

(编辑:李大同)

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

    推荐文章
      热点阅读