0

此代码检查与套接字连接的 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;
}
4

2 回答 2

0

代码完全按照您的要求执行:对于每个连接,(异步)等待按钮单击该连接。

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

var buttonTasks = deelnemers.Select(deelnemer => CheckButtons(clients[deelnemer.DeelnemerVoornaam + " " + deelnemer.DeelnemerNaam]));
var buttonsClicked = await Task.WhenAll(buttonTasks);
于 2013-02-27T21:06:29.887 回答
0

您可以通过创建另一个可以设置的方法deelnemersTimereerste然后在没有awaiting 的情况下调用该方法(至少不是立即)来做到这一点:

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字段。)

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

于 2013-02-27T23:29:18.243 回答