0

最近、Silverlight 5 の async/await(asyncctp) 機能に関していくつかのテストを実行しました。

次のハードウェアが両方のテストに使用されました。

  • インテル snb 2.3g
  • 8gDDR
  • Windows 7 - 64 ビット
  • シルバーライト 5
  • SQL Server 2008 - R2

テストロジックは次のとおりです。

  1. 非同期/待機なし:

    public void LoadMasterItem(string strUNIT_ID)
    {
        **DateTime dt = DateTime.Now;**
        ctx.OBS_UNITs.Clear();
        this.IsMasterItemBusy = true;
        ctx.Load(ctx.GetOBS_UNITQuery().Where(p => p.UNIT_ID == strUNIT_ID)).Completed += (sender, e) =>
        {
            this.MasterItem = ctx.OBS_UNITs.FirstOrDefault();
            this.IsMasterItemBusy = false;
             LoadDataArgs args = ExceptionManager.CheckDataContextResult(sender, args);
             **var ts = DateTime.Now.Subtract(dt).Ticks;**
            **string str = ts.ToString();**
        };
    }
    
  2. 非同期/待機あり:

    public **async** Task<LoadDataArgs> LoadMasterItem(string UNIT_ID)
    {
        **DateTime dt = DateTime.Now;**
        ctx.OBS_UNITs.Clear();
        var oper = await ctx.Load(ctx.GetOBS_UNITQuery().Where(p => p.UNIT_ID == UNIT_ID)).AsTask();
        LoadDataArgs args = ExceptionManager.CheckDataContextResult(oper);
        if (args.LoadState)
        {
            this.MasterItem = oper.Entities.FirstOrDefault();
        }
    
        **var ts = DateTime.Now.Subtract(dt).Ticks;**
        **string str = ts.ToString();**
        return args;
    }
    

実験 1 のティック数: 5304010
実験 2 のティック数: 30001

async/await を使用すると、Silverlight アプリケーションがこれほど大幅に改善される理由と方法に興味がありました。私のテストが「不公平」だった場合は、どのように改善できるかについてもコメントしてください.


デバッグ モードを使用せずに、"str" 値を UI にバインドしました。これらは IIS でホストされ、IE9 で実行されました。

結果は次のとおりです。

1 のティック: 5504010
2 のティック: 5680325

回答ありがとうございます。実際のパフォーマンスに関しては、私が間違っていたようです。

4

2 に答える 2

1

await 演算子は、チェーン呼び出しを処理するときにコードを読みやすくし、複雑さを軽減するのに役立ちます。

于 2014-11-06T20:37:29.057 に答える
1

2番目のサンプルで時間を確認すると、ロード操作が実際に完了したとは思いません。メソッドは、非同期で実行されるタスクを返しました。必ずしも、非同期メソッドから戻るまでにロードが実行されたことを意味するわけではありません。

于 2012-09-07T08:18:32.333 に答える