1
for (int i = 1; i < servers.Count;i++){
    var server = new SpeedTestServer(servers[i]);
    server.dist = haversine(server);

    if (closestKnownServer.dist - server.dist > distTreshold){
        closestKnownServer = server;
        this.servers.Add(server);
        this.servers.RemoveAt(0);
    }
    else if (Math.Abs(closestKnownServer.dist - server.dist) <= distTreshold){
        this.servers.Add(server);
        //BUG: we need to enable it but it causes hang
        pingTasks.Add(
            Task.Factory.StartNew(async () => {
                await server.ping();
                if (closestKnownServer.latency > server.latency){
                    closestKnownServer = server;
                    this.servers.RemoveAt(0);
                }
            })
        );
    }

}
await Task.WhenAll(pingTasks);
return closestKnownServer;

上記のコードを見てください。タスクのリストを作成して入力します。それから私たちはそれらすべてを待ちます。しかし、それは正しく機能しません! 終了した場合は WhenAll で生成されるタスクですが、それに含まれるタスクはそうではありません。これは、ブレークポイントをラムダとメソッドの最後の行に配置すると表示されます。

完全なコード

PS同期も必要になることはわかっていますが、c#でそのための組み込みライブラリが見つかりませんでした。

4

1 に答える 1