Foreach使用await方法
本文关键字:方法 await 使用 Foreach | 更新日期: 2023-09-27 18:01:39
此代码检查与套接字连接的2个客户端,其中一个首先按下按钮,连接和接收工作正常,但如果我单击客户端的按钮,在deelnemersTimer和客户端字典中是第二,它不做任何事情,它将一直等待,直到我单击字典中的第一个。我很确定这是等待在foreach是错误的,但我需要做些什么来改变这个正确的工作?
clients是一个包含客户端名称及其套接字的字典。deelnemersTimers是一个字典,其中包含客户端名称和他们单击按钮的时间。deelnemer是荷兰语,意思是参与者。
foreach (Deelnemer deelnemer in deelnemers)
{
deelnemersTimer[deelnemer.DeelnemerVoornaam + " " + deelnemer.DeelnemerNaam] = await CheckButtons(clients[deelnemer.DeelnemerVoornaam + " " + deelnemer.DeelnemerNaam]);
}
deelnemersTimer.Values.Min();
var eerste = deelnemersTimer.Where(p => p.Value == deelnemersTimer.Values.Min()).Select(p => p.Key).FirstOrDefault();
private async Task<long> CheckButtons(StreamSocket socket)
{
DataReader reader = new DataReader(socket.InputStream);
var actualStringLength = await reader.LoadAsync(1);
long time = stopwatch.ElapsedMilliseconds;
return time;
}
您可以通过创建另一个方法来实现这一点,该方法将设置deelnemersTimer
和eerste
,然后调用该方法而不设置await
(至少不是立即):
private Task ProcessButton(Deelnemer deelnemer)
{
string id = deelnemer.DeelnemerVoornaam + " " + deelnemer.DeelnemerNaam;
deelnemersTimer[id] = await CheckButtons(clients[id]);
// is this the first one?
if (eerste == null)
eerste = id;
}
…
var tasks = deelnemers.Select(ProcessButton);
await Task.WhenAll(tasks);
(这里假设deelnemersTimer
和eerste
都是字段。)
这样,您可以同时开始处理每个按钮,并在它们完成时设置结果。
代码正在执行您告诉它要做的事情:对于每个连接,(异步)等待该连接上的按钮单击。
如果你想同时监听一个按钮点击所有连接,你可以这样做:
var buttonTasks = deelnemers.Select(deelnemer => CheckButtons(clients[deelnemer.DeelnemerVoornaam + " " + deelnemer.DeelnemerNaam]));
var buttonsClicked = await Task.WhenAll(buttonTasks);