【C#】非同期処理完了を通知する方法 |
同期で処理すると画面が固まったままになってしまいます。
今回は画面が固まらないようにWCFは非同期で
処理してみたいと思います。
※4.5ならServiceResourcesの設定で出来るらしいのですが
今回はそれを使わない前提で……
WCFまでサンプルに入れてしまうと
非常に長くなってしまうので
WindowsFormで完結するサンプルを作成します。
「テキストボックス("textBox1")と
ボタン("button1")を配置したWindowsFormを作成。
ボタンをクリックすると非同期で下記を実行
・3秒待つ
・引数に設定されたコードバックメソッドを実行
※コールバックの引数に文字列を設定
コールバックメソッドでは引数の文字列をテキストボックスに設定」
デザイナでFormを一つ作成します。
テキストボックスとボタンを配置します。
コードビハインドは下記のとおりです。
using System;
using System.Windows.Forms;
using System.Threading.Tasks;
namespace AsyncTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Task生成メソッド
/// </summary>
/// <param name="control">Form1のインスタンス</param>
/// <param name="callback">処理終了時に呼ばれるコールバックメソッド</param>
/// <returns>Taskインスタンス</returns>
private Task CreateTask(Control control,Action<string> callback)
{
return new Task(() =>
{
//3000ミリ秒待つ
System.Threading.Thread.Sleep(3000);
//処理終了を知らせるため、コールバックを呼ぶ
control.Invoke(callback, "処理が終了しました");
});
}
private void button1_Click(object sender, EventArgs e)
{
//ボタンを無効にする
this.button1.Enabled = false;
//タスクを実行する
this.CreateTask(this, (message) =>
{
//タスクから呼ばれたときの引数を設定
this.textBox1.Text = message;
//ボタンを有効にする
this.button1.Enabled = true;
}).Start();
}
}
}
かなり楽した実装になっていますが、
control#InvokeメソッドとActionがミソです。
最後に実行サンプルです
参考になれば幸いです。
よかったらクリックしてください。
にほんブログ村