0

このコードは、1 つが最初にボタンを押すソケットに接続された 2 つのクライアントをチェックします。接続と受信は正常に機能しますが、deelnemersTimer とクライアント ディクショナリで 2 番目にあるクライアントのボタンをクリックすると、何も実行されません。辞書の最初のものをクリックするまで待ってください。間違っているのは foreach の await だと確信していますが、これを正しく機能させるには何を変更する必要がありますか?

client は、クライアント名とそのソケットを含む辞書です。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

これを行うには、設定する別のメソッドを作成してdeelnemersTimerから、 (少なくともすぐにではなく)ingeersteせずにそのメソッドを呼び出します。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ています。)

このようにして、各ボタンの処理を同時に開始し、完了時に結果を設定します。

于 2013-02-27T23:29:18.243 に答える
0

コードは、指定したとおりに実行しています。接続ごとに、(非同期に) その接続でボタンがクリックされるのを待ちます。

すべての接続で同時にボタンのクリックをリッスンする場合は、次のようにすることができます。

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