WinFormsで学ぶ「非同期処理」入門

― フリーズしないアプリを作る第一歩 ―

■ なぜ非同期処理を学ぶのか?

まず、次のコードを考えてみます。

private void button1_Click(object sender, EventArgs e)
{
    System.Threading.Thread.Sleep(5000);
    MessageBox.Show("完了しました");
}

ボタンを押すと…

  • 5秒間アプリが固まる
  • ウィンドウが白くなる
  • 「応答なし」と表示される

これは UIスレッドが止まっている からです。

WinFormsは

UI(画面表示)と処理が同じスレッドで動いている

という特徴があります。

だから重い処理をそのまま書くと、

画面も一緒に止まります。


■ 非同期処理とは何か?

非同期処理とは、

「時間のかかる処理を別で動かし、画面は止めない」仕組み

です。

WinFormsでは主に次の形で書きます。

private async void button1_Click(object sender, EventArgs e)
{
    await Task.Delay(5000);
    MessageBox.Show("完了しました");
}

違いは3つ。

  • async が付いている
  • await が付いている
  • Thread.Sleep ではなく Task.Delay

これだけで、

✔ ボタンを押しても画面は固まらない

✔ ウィンドウを動かせる

✔ 他の操作もできる

になります。


■ async / await の意味

async

このメソッドは「非同期で動くよ」という宣言。

await

「この処理が終わるまで待つけど、UIは止めない」

という意味。

つまり:

処理は待つが、画面は止めない

これが最大のポイントです。


■ なぜ Thread.Sleep はダメなのか?

Thread.Sleep(5000);

これは

スレッドを完全に停止させる命令

です。

WinFormsでは

UIスレッドが止まる = アプリが固まる

だから基本的に使いません。


■ 実践演習(授業向け)

課題1

ボタンを押すと:

  • 「処理中…」とLabelに表示
  • 3秒待つ
  • 「完了」に変える

解答例

private async void button1_Click(object sender, EventArgs e)
{
    label1.Text = "処理中...";
    await Task.Delay(3000);
    label1.Text = "完了";
}

これで

✔ フリーズしない

✔ 状態が見える

アプリになります。


■ 応用例(ネットワーク通信)

実務では:

  • API通信
  • データベースアクセス
  • ファイル読み込み
  • Webアクセス

すべて非同期です。

例えば:

using System.Net.Http;

private async void button1_Click(object sender, EventArgs e)
{
    using (var client = new HttpClient())
    {
        var result = await client.GetStringAsync("https://example.com");
        textBox1.Text = result;
    }
}

これは現代アプリ開発では必須です。


■ ここが理解ポイント

非同期処理は

「速くする技術」ではありません。

正しくは:

UIを止めない技術

です。


訪問数 1 回, 今日の訪問数 1回

C#,非同期

Posted by hidepon