3

パフォーマンスを向上させるためにこのコードを改善できるかどうかを知りたいです。私はサーバー側の非同期処理全体に慣れていないので、ここで我慢してください。

con.GetGame(id, game => {

    foreach(Player p in game.Team1)
    {
        p.SomeExtraDetails = GetPlayerDetails(p.Id);
    }

    // I would like the player data to be set on all players
    // before ending up here
});

private PlayerDetails GetPlayerDetails(double playerId)
{
    var task = con.GetPlayer(playerId);

    PlayerDetails ret = null;

    Task continuation = task.ContinueWith(t =>
    {
        ret = t.Result;
    });

    continuation.Wait();

    return ret;
}

正しければcontinuation.Wait();、メインスレッドをブロックします。

タスクを同時に実行する方法はありますか?

4

3 に答える 3

7

理想的には、これらの操作を完全に非同期にする必要があります。

private Task<PlayerDetails> GetPlayerDetailsAsync(double playerId)
{
    return con.GetPlayer(playerId);
}

con.GetGame(id, game => {
    var tasks = game.Team1
                    .Select(p => new { Player=p, Details=GetPlayerDetailsAsync(p.Id)})
                    .ToList(); // Force all tasks to start...

    foreach(var t in tasks)
    {
        t.Player.SomeExtraDetails = await t.Details;
    }

    // all player data is now set on all players
});

それができない場合 (つまり、VS 2012 を使用していない場合)、コードを次のように単純化できます。

// This is a more efficient version of your existing code
private PlayerDetails GetPlayerDetails(double playerId)
{
    var task = con.GetPlayer(playerId);
    return task.Result;
}

con.GetGame(id, game => {
    // This will run all at once, but block until they're done
    Parallel.ForEach(game.Team1, p =>
    {
        p.SomeExtraDetails = GetPlayerDetails(p.Id);
    });

});
于 2013-10-18T23:57:00.133 に答える
0

Task.ContinueWith の代わりに、GetGame ページでParallel.ForEachを使用することを検討してください。

于 2013-10-18T23:52:17.040 に答える