C#

C# 同期 非同期 await async メモ

 

ここの方のメモ

@see http://kimux.net/?p=902

動画もあって凄くわかりやすい。

 

通常

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>)」を表す。

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)