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





