Upgrade to Pro — share decks privately, control downloads, hide ads and more …

New Asynchronous Feature for C# 5.0

Ktz
September 30, 2012

New Asynchronous Feature for C# 5.0

async / awaitというC# 5.0から備わった新機能についての解説
async / awaitを使ったことによる失敗体験

Ktz

September 30, 2012
Tweet

More Decks by Ktz

Other Decks in Programming

Transcript

  1. 1.5. async Task¶ public async void Foo() { var bar

    = await BarAsync(); // 上の結果待ってから続行 return await BazzAsync(bar); } public async Task<int> BarAsync() { ... }
  2. 1.7. async void¶ public async void Foo() { await BarAsync();

    // 上の結果待たずに続行 await BazzAsync(); } public async void BarAsync() { ... }
  3. 1.12. Awaiter?¶ struct Awaiter : INotifyCompletion { public bool IsCompleted

    { get; } public T GetResult() {} // from INotifyCompletion void OnCompleted(Action k) {} }
  4. 1.22. async / awaitでの苦労話¶ await Task.Run(async () => { await

    FooAsync(); // ↓実行されない return await BarAsync(); });
  5. 1.31. async / awaitでの苦労話¶ int Foo() { // ↓ 中でawaitするメソッド

    var task = BarAsync(); // ココでお見合い task.Wait(); return task.Result; }
  6. 1.35. async / awaitでの苦労話¶ public async void Foo() { var

    task = BarAsync(); task.GetAwaiter().GetResult(); }
  7. 1.39. async / awaitでの苦労話¶ Paralle.Foreach(list, async (x) => { await

    Foo(x); }); • すべてのアクション完了まで待ってほしいのに... • Task.Run同様、投げっ放しジャーマン
  8. 1.41. async / awaitでの苦労話¶ 1. ユニットテストしづらい • NUnitはasync / await未対応

    • 何も考えず走らせると • テストが実行されず終了(CLI版)
  9. 1.44. async / awaitでの苦労話¶ public void RunTest(Func<Task> inTest) { inTest.GetAwaiter().GetResult();

    } [Test] public void _TestSomething() { RunTest(async () => { ... }); }
  10. 1.45. async / awaitでの苦労話¶ GUI Runnerの場合 • 自前の同期コンテキストを気合いで実装 • 割と安定してる

    • けどグローバルな存在なので、ほかでこっそり使われると死ねる