这段代码检查2个连接到套接字的客户端,其中一个客户端先按下一个按钮,连接和接收工作正常,但如果我单击deelnemersTimer和客户端字典中第二个客户端的按钮,它不会做任何事情,它将一直等待,直到我单击字典中第一个按钮。我很确定是foreach中的等待是错误的,但是我需要做些什么才能让它正常工作呢?
客户端是一个包含客户端名称及其套接字的字典。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;
}发布于 2013-02-28 07:29:18
您可以通过创建另一个方法来设置deelnemersTimer和eerste,然后在不使用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-28 05:06:30
代码执行的正是您告诉它做的事情:对于每个连接,(异步地)等待单击该连接的按钮。
如果你想监听同时点击所有连接的按钮,你可以这样做:
var buttonTasks = deelnemers.Select(deelnemer => CheckButtons(clients[deelnemer.DeelnemerVoornaam + " " + deelnemer.DeelnemerNaam]));
var buttonsClicked = await Task.WhenAll(buttonTasks);https://stackoverflow.com/questions/15121931
复制相似问题