非同期処理 - 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 = "完了";
}