ここの方のメモ
動画もあって凄くわかりやすい。
もくじ
通常
private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); label1.Text = i.ToString(); } }
これだとカウントが終わるまで固まる。これを非同期処理して解決させるのが以下。
Taskで非同期処理
private void button1_Click(object sender, EventArgs e) { var task = new TaskFactory().StartNew(() => { for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); this.Invoke(new Action(() => label1.Text = i.ToString())); } }); }
async/awaitでの非同期
private async void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { await Task.Run(() => System.Threading.Thread.Sleep(1000)); label1.Text = i.ToString(); } }
ラムダ式
private void button1_Click(object sender, EventArgs e) { Action func = async () => { for (int i = 0; i < 10; i++) { await Task.Run(() => System.Threading.Thread.Sleep(1000)); label1.Text = i.ToString(); } }; func(); }
ここの方のメモ
@see http://mcommit.hatenadiary.com/entry/2016/07/22/014657
同期処理
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace async { class Program { static int count = 1; static void Main(string[] args) { Task task = Task.Factory.StartNew(() => { Console.WriteLine(count.ToString() + "!"); count++; Thread.Sleep(1000); Console.WriteLine(count.ToString() + "!"); count++; Thread.Sleep(1000); Console.WriteLine(count.ToString() + "!"); count++; Thread.Sleep(1000); Console.WriteLine("だ~~~~~~~~~~"); Thread.Sleep(1000); }); // だ~が終わったタイミングで終了する task.Wait(); } } }
非同期
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace async { class Program { static int count = 1; static void Main(string[] args) { Task task = Task.Factory.StartNew(() => { Console.WriteLine(count.ToString() + "!"); count++; Thread.Sleep(1000); Console.WriteLine(count.ToString() + "!"); count++; Thread.Sleep(1000); Console.WriteLine(count.ToString() + "!"); count++; Thread.Sleep(1000); Console.WriteLine("だ~~~~~~~~~~"); Thread.Sleep(1000); }); // メインスレッドが先に終わらないように while (true) ; } } }
aysnc awaitを使った非同期
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace async { class Program { static async Task HelloWorldAsync() { Console.WriteLine("[Async] HelloWorldAsync Start...\n"); await Task.Run(() =>{ Console.WriteLine("[Async] 1"); Thread.Sleep(1000); Console.WriteLine("[Async] 2"); Thread.Sleep(1000); Console.WriteLine("[Async] 3"); Thread.Sleep(1000); }); Console.WriteLine("[Async] HelloWorldAsync End...\n"); } static void Main(string[] args) { Console.WriteLine("[Main] Start...\n"); Task task = HelloWorldAsync(); Console.WriteLine("[Main] HelloWorldAsync Called...\n"); task.Wait(); Console.WriteLine("[Main] End...\n"); while (true) ; } } }
Taskを極めろ!async/await完全攻略
http://qiita.com/acple@github/items/8f63aacb13de9954c5da
async/awaitキーワード、そして「非同期メソッド」とは
- シグネチャにasyncを付けたメソッドのことを「非同期メソッド」と呼びます。
- 非同期メソッドの特徴はただ一つ、文中でawaitキーワードを使えるようになることです。
- そして、awaitキーワードの効果は、「指定したTaskの完了を待つ」「そして、その結果を取り出す」ことです。
- 最後に、非同期メソッドの戻り値は必ずTask/Task<T>になります。
なにか見えてきませんか?
非同期メソッドとは、複数の「タスク」の実行順序などを記述した「一つのタスク」である。
いわゆる、作業手順書のようなものである。例
「1000ミリ秒待機する『タスク』の完了を待ち、その後”Done!”を出力する、という『タスク』」
async Task AsyncMethod() { await Task.Delay(1000); // 1000ミリ秒待機するという仕事の完了を待ち、 WriteLine("Done!"); // "Done!"をコンソールに出力する } // という、「一つのTask」を表す。「HttpClientでGETした内容を文字列で手に入れる『タスク』」
async Task<string> AsyncMethod2(Uri uri)
{
using (var client = new HttpClient()) // <- 本当はHttpClientをusingで使っちゃダメ
{
var response = await client.GetAsync(uri); // <- 「GETせよ」のタスクを開始し、その完了を待機する
var text = await response.Content.ReadAsStringAsync(); // 「レスポンスからその本文をstringとして読み出す」タスクを開始し、その完了を待機する
return text; // 読み出したtextを返す
}
} // という「一つのタスク(Task<string>)」を表す。