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回



ディスカッション
コメント一覧
まだ、コメントがありません