与Task.ConfigureAwait进行线程同步(false)

5 .net c# async-await

请考虑以下代码:

using System.IO;
using System.Threading.Tasks;

public class MyClass
{
    private int count;

    public async Task<int> MyReadAsync(Stream stream, byte[] buffer)
    {
        var read = await
            stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
        this.count += read;
        return read;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们假设MyReadAsync从WPF应用程序的事件处理程序直接调用此方法,如下所示:

private async void OnWhatever(object sender, EventArgs args)
{
    await myObject.MyReadAsync(this.stream, this.buffer);
}
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 使用ConfigureAwait(false)允许以行开头的代码部分this.count += read;可以在任何线程池线程上执行,对吗?
  2. 对于两个单独的调用MyReadAsync,不能保证this.count += read;以相同的线程执行的代码部分是正确的吗?
  3. 如果1和2是正确的,那么在我看来代码this.count += read;应该用适当的线程同步原语保护,对吗?

Har*_*san 3

是的,你是对的。为了避免任何线程同步问题,您应该在增加计数的行周围应用适当的锁定

  • 谢谢,据我所知,迄今为止没有人愿意提及使用ConfigureAwait(false)可能会使线程同步变得必要。我认为这对每个人来说并不是显而易见的,因此可能会导致许多难以发现的错误。 (2认同)