非同期処理 - peace098beat/windows_applicaciton GitHub Wiki

かえらせると


        private async void button_Ticker_Click(object sender, EventArgs e)
        {
            // 非同期で動作開始
            Task<IRestResponse> task = Task.Run(() => {
                IRestResponse result = client.Ticker.All();
                return result;
            });

            // task.Resultに格納されている
            textBox1.Text = task.Result.Content;
        }

async/await + Task

public async void SampleAsync()
{
    this.textBox1.Text = "実行中";

    await Task.Run(() =>
    { 
            Thread.Sleep(1000);  // 重たい処理のつもり
    });

    this.textBox1.Text = "完了";
}

Dispatcher

WPF アプリケーションは、レンダリング(描画)用とユーザーインターフェイス用の2つのスレッドを用いて動作します。 レンダリングスレッドはバックグラウンド動作のため、開発者はアクセスできません。開発者が扱えるのは、ユーザーインターフェイス用スレッド(以下 UIスレッド)のみとなります。そしてこの UI スレッドは、パフォーマンス上の理由により(スレッドセーフにするとオーバーヘッドが発生し、描画遅延等の問題を起こすためか)スレッドセーフに設計されてないのが特徴です。 WPFでは、ほとんどのオブジェクトが UI スレッド上で動作する「シングルスレッドモデル」を採用しているため、UI スレッド外からそのオブジェクトにアクセスすると、例外が発生します。 例えば、以下のように ListBox へのアイテム追加を並列実行すると、InvalidOperationException がスローされます。 http://d.hatena.ne.jp/hilapon/20130225/1361779314

public async void SampleAsync()
{
    this.textBox1.Text = "実行中";

    await Task.Run(() =>
    { 
        for (int j = 0; j < 10; j++)
        {
            Thread.Sleep(1000);  // 重たい処理のつもり

            textBox2.Dispatcher.BeginInvoke(
             new Action(() =>
             {
                 textBox2.Text = j.ToString();
             })
            );
        }

    });

    this.textBox1.Text = "完了";
}