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;
}

Foreach使用await方法

您可以通过创建另一个方法来实现这一点,该方法将设置deelnemersTimereerste,然后调用该方法而不设置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);

(这里假设deelnemersTimereerste都是字段。)

这样,您可以同时开始处理每个按钮,并在它们完成时设置结果。

代码正在执行您告诉它要做的事情:对于每个连接,(异步)等待该连接上的按钮单击。

如果你想同时监听一个按钮点击所有连接,你可以这样做:

var buttonTasks = deelnemers.Select(deelnemer => CheckButtons(clients[deelnemer.DeelnemerVoornaam + " " + deelnemer.DeelnemerNaam]));
var buttonsClicked = await Task.WhenAll(buttonTasks);