1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public Form1() { Test1(); MessageBox.Show("done"); } private async Task Test1() { // awaitは一旦スレッドを開放し、Task完了後に同じスレッドを利用する。 // awaitがあると1の後、クリックするまで2は表示されない。 // awaitがないと1の後すぐに2が表示される。 // awaitの有無に関係なくdoneはすぐに表示される。 await Task.Run(()=> { MessageBox.Show("1"); }); MessageBox.Show("2"); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public Form1() { // Task作成(開始) -------------------------------------------------------- var task1 = Task.Factory.StartNew(() => { MessageBox.Show("1/t"); }); // または // var task = Task.Run() // var = new Task() // などある MessageBox.Show("2"); // 1/tは非同期になるので1/t,2は同時に表示される。 // ContinueWith -------------------------------------------------------- // 元Taskに継続Taskの作成 task1.ContinueWith((t) => { MessageBox.Show("3/t"); }); // 1に継続しているので1/tを消すと3/tが表示される // 2を消しても表示されない(ただ2も消さないとMessageBoxで止まり継続Taskが作成されない) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public Form1() { var t = Test1(); MessageBox.Show(t.Result); // Resultを利用すると非同期の終了を待つ } private async Task<string> Test1() { // awaitがないと結果(Task)を取り出せない var t = await Task.Run(()=> { return "1"; }).ConfigureAwait(false); // ConfigureAwaitがないとデッドロックする。 // t.await後に元のスレッドを利用しようとするが、t.Resultでスレッドを利用中のため return t; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public Form1() { // 基本的な考え方 // asyncをメソッドにつけると非同期メソッドとなり、非同期メソッドは文中でawaitが使える。 // 非同期メソッドの返り値はTaskとなる。 // awaitは指定したTaskの完了を待ち結果を取り出せる。 // Task自体はasync関係なく作成できる Task.Run(() => { MessageBox.Show("1"); }); // Taskをawaitするにはasyncが必要。 // 下記は不可 // await Task.run(() => { // MessageBox.Show("1"); // }); // 非同期メソッド(async)をラムダ式で表すこともできる。 Func<Task<string>> f = async () => { return await Task.Run(() => { return "hello world"; }).ConfigureAwait(false); }; // ここで非同期メソッドは実行されている。 var t = f(); // 2が表示された後、hello worldが表示される。 MessageBox.Show("2"); MessageBox.Show(t.Result); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public Form1() { InitializeComponent(); // TaskからUIを更新する場合 Shown += (s, e) => { Task.Run(() => { for (int i = 0; i < 1000000; i++) { Invoke(new Action(() => { textBox1.Text = i.ToString(); })); } }); }; } |