[C#] 非同期ラムダの利用 - await async と併用したラムダ式の利用
このページのタグ:[C#] [ラムダ式]
非同期ラムダの利用とコードについて紹介します。

プログラム

UI

下図のUIを作成します。

コード:非同期ラムダを利用しない場合

非同期ラムダを利用しない場合のコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AsyncLambdaExpressions
{
  public partial class FormMain : Form
  {
    int value = 200;

    public FormMain()
    {
      InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
      await AsyncProc();
      textBox1.Text += "value:"+Convert.ToString(value)+"\r\n";
    }

    private async Task AsyncProc()
    {
      await Task.Delay(1000);
      value += 100;
    }
  }
}

解説

button1をクリックすると、await async を利用した非同期処理でAsyncProc()が呼び出されます。
AsyncProcではDelay処理により、処理が1秒間停止しますが、AsybncProc自体が非同期で呼び出されているため、Delay中でもUIはフリーズせずに操作できます。Delay後valueに100を加算し、AsybncProcを抜けます。
メインスレッドは、button1のClickでawait AsynProc()を呼び出した後は、以降の行は実行せず、非同期処理の戻りを待つため、valueに100が加算され、AsyncProc関数の処理を抜けた後で、テキストボックスにvalueの値を表示します。

async, awaitの動作の詳細についてはこちらの記事を参照してください。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。初期値の200に100を加算した"300"がテキストボックスに表示されます。


[button1]をクリックするごとに、100加算された値がテキストボックスに表示されます。

コード:非同期ラムダを利用したコード


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AsyncLambdaExpressions
{
  public partial class FormMain : Form
  {
    int value = 200;

    public FormMain()
    {
      InitializeComponent();

      button2.Click += async (sender, e) =>
      {
        await AsyncProc();
        textBox1.Text += "value:" + Convert.ToString(value) + "\r\n";
      };
    }

    private async Task AsyncProc()
    {
      await Task.Delay(1000);
      value += 100;
    }
  }
}

解説

button2のClickイベントをフォームのコンストラクタ中で実装しています。
デリゲートとラムダ式の書き換えでも紹介している、デリゲートをラムダ式で記述する方式でbutton2のclickイベントを実装しています。
ただし、今回はasync, await を用いた非同期関数の実装のため、ラムダ式の先頭に async キーワードを記述します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。初期値の200に100を加算した"300"がテキストボックスに表示されます。


[button1]をクリックするごとに、100加算された値がテキストボックスに表示されます。


登録日 :2016-07-15    最終更新日 :2016-09-01
このページのタグ:[C#] [ラムダ式]
Japanese
プライバシー    iPentecについて
iPentec all rights reserverd. (ISDC)