---
# System prepended metadata

title: C# Task `async/await` と `Wait()` の処理速度比較 2021-12-30
tags: [CancellationTokenSource, Task, ConfigureAwait, async, C#, 処理速度, await, SynchronizationContext, Wait()]

---

---
lang: ja-jp
breaks: true
---
# C# Task `async/await` と `Wait()` の処理速度比較 2021-12-30

## 1. `async/await`　※遅い

```csharp=
private async void button2_Click(object sender, EventArgs e)
{
    var cancellationToken = new CancellationTokenSource();
    Stopwatch sw = new Stopwatch();
    sw.Start();
    
    for (int i = 0; i < 1000000; i++)
    {
        var task = new Task(() => { });
        task.Start();
        await task.WaitAsync(cancellationToken.Token);
    }
    
    sw.Stop();
    AppendText(sw.Elapsed.ToString());
}
```

## 2. `async/await` `ConfigureAwait(false)`　※圧倒的に早い

```csharp=
private async void button2_Click(object sender, EventArgs e)
{
    var cancellationToken = new CancellationTokenSource();
    Stopwatch sw = new Stopwatch();
    sw.Start();
    
    for (int i = 0; i < 1000000; i++)
    {
        var task = new Task(() => { });
        task.Start();
        await task.WaitAsync(cancellationToken.Token)
            .ConfigureAwait(false);
    }
    
    sw.Stop();
    AppendText(sw.Elapsed.ToString());
}
```

## 3. `Wait()` ※圧倒的に早い

```csharp=
private void button3_Click(object sender, EventArgs e)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    
    for (int i = 0; i < 1000000; i++)
    {
        var task = new Task(() => { });
        task.Start();
        task.Wait();
    }
    
    sw.Stop();
    AppendText(sw.Elapsed.ToString());
}
```

## 結果



| 項番 | 内容 | 処理速度 |
| -------- | -------- | -------- |
| 1     | `async/await` | 00:00:36.4577603 |
| 2     | `async/await` `ConfigureAwait(false)` | 00:00:01.6336271 |
| 3     | `Wait()`     | 00:00:01.4675350 |

:::info
* 環境：net6.0-windows
* WinFormから実行
:::

###### tags: `C#` `Task` `async` `await` `Wait()` `処理速度` `CancellationTokenSource` `ConfigureAwait` `SynchronizationContext`
