ここの方のメモ
動画もあって凄くわかりやすい。
もくじ
通常
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>)」を表す。





