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

async/await

 async/await

C#で開発され、ほかのいくつもの言語でも導入されてきている画期的な非同期処理機能のasync/await。マルチコアのCPUが当たり前になり、非同期処理は常に使う必要が出てきました。async/awaitは非同期処理の中でも最も簡単な場合の処理しかこなせないものですが、マルチコアだから常に使わなくてはいけないといわれる非同期処理を整理すると、実際に使われる非同期処理の90%以上はasync/awaitで対応できる範囲に含まれます。実質的にマルチコアに伴う非同期処理のプログラムコストをほぼ0に近づけたC#のasync/awaitについて解説します。

まりも

May 16, 2024
Tweet

More Decks by まりも

Other Decks in Programming

Transcript

  1. 非同期処理の難しさ public void Download() { WebClient client = new WebClient();

    client.DownloadDataCompleted += Client_DownloadDataCompleted; client.DownloadDataAsync("http://www.yahoo.co.jp/"); } private void Client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) { byte[] result = e.Result; }
  2. コールバック地獄 $. getJSON( 'http://www.hoge.com/dosomething', null, function (data) { dosomething(data); $.

    getJSON( 'http://www.hoge.com/dosomething2', null, function (data) { dosomething2(data); $. getJSON( 'http://www.hoge.com/dosomething3', null, function (data) { dosomething3(data); }, ); }, ); }, );
  3. コールバック地獄 $.getJSON('http://www.hoge.com/dosomething') .then(function (data) { dosomething(data); return $.getJSON('http://www.hoge.com/dosomething2'); }).then(function (data)

    { dosomething2(data); return $.getJSON('http://www.hoge.com/dosomething3'); }).then(function (data) { dosomething3(data); });
  4. public async Task FuncAsync() { await FuncAsync1(); await FuncAsync2(); await

    FuncAsync3(); } コンパイラが頑張ります
  5. public Task FuncAsync(dynamic obj) { if (obj.status == 1) goto

    end1; if (obj.status == 2) goto end2; if (obj.status == 3) goto end3; var t1 = FuncAsync1(); obj.t1 = t1; return new Task(obj); end1: var t2 = FuncAsync2(); obj.t2 = t2; return new Task(obj); end2: var t3 = FuncAsync3(); obj.t3 = t3; return new Task(obj); end3: return new Task(obj); }
  6. public Task FuncAsync(dynamic obj) { switch (obj.status) { case 0:

    var t1 = FuncAsync1(); obj.t1 = t1; return new Task(obj); case 1: var t2 = FuncAsync2(); obj.t2 = t2; return new Task(obj); case 2: var t3 = FuncAsync3(); obj.t3 = t3; return new Task(obj); case 3: return new Task(obj); } }