Back to Devexpress

CRR0037 - Task.Wait is used in an async method

coderushforroslyn-119692-static-code-analysis-analyzers-library-crr0037-task-wait-is-used-in-an-async-method.md

latest2.2 KB
Original Source

CRR0037 - Task.Wait is used in an async method

  • Feb 28, 2025

This analyzer detects blocking task.Wait methods with the new async/await pattern. Use the new await-friendly methods instead of blocking methods:

BlockingAwait-friendly
task.Wait, task.Resultawait task
Task.WaitAnyawait Task.WhenAny
Task.WaitAllawait Task.WhenAll
Thread.Sleepawait Task.Delay

Refer to the Task-based Asynchronous Pattern (TAP) MSDN article for more information.

csharp
async Task<string> MethodNameAsync(int value, CancellationToken token) {
    token.ThrowIfCancellationRequested();
    var tasks = new List<Task>();
    for (int i = 0; i < 10; i++)
        tasks.Add(Task.Delay(100));
    Task.WaitAll(tasks.ToArray()); // CRR0037
    return value.ToString();
}
vb
Async Function MethodNameAsync(value As Integer, token As CancellationToken) As Task(Of String)
    token.ThrowIfCancellationRequested()
    Dim tasks = New List(Of Task)()
    For i As Integer = 0 To 9
        tasks.Add(Task.Delay(100))
    Next i
    Task.WaitAll(tasks.ToArray()) ' CRR0037
    Return value.ToString()
End Function

Replace the Task.WaitAll call with await Task.WhenAll to fix this issue.

csharp
async Task<string> MethodNameAsync(int value, CancellationToken token) {
    token.ThrowIfCancellationRequested();
    var tasks = new List<Task>();
    for (int i = 0; i < 10; i++)
        tasks.Add(Task.Delay(100));
    await Task.WhenAll(tasks.ToArray());
    return value.ToString();
}
vb
Async Function MethodNameAsync(value As Integer, token As CancellationToken) As Task(Of String)
    token.ThrowIfCancellationRequested()
    Dim tasks = New List(Of Task)()
    For i As Integer = 0 To 9
        tasks.Add(Task.Delay(100))
    Next i
    Await Task.WhenAll(tasks.ToArray())
    Return value.ToString()
End Function

See Also

Suppress Analyzers