C# 与Task.ConfigureAwait的线程同步(false)

C# 与Task.ConfigureAwait的线程同步(false),c#,.net,async-await,C#,.net,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, b

考虑以下代码:

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;
    }
}
以下是我的问题:

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

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

    谢谢,据我所知,到目前为止,没有人懒得提及使用ConfigureWait(false)可能需要线程同步。我认为这不是每个人都能立即看到的,因此可能会导致许多难以发现的错误。在这种情况下,联锁而不是锁定就足够了。我认为您应该首先问一个问题:
    Stream
    s甚至支持在另一个读取仍在进行时启动新的读取吗?这样做有意义吗?@svick:即使流在第一次读取完成之前不开始第二次读取,也会有竞争条件。
    private async void OnWhatever(object sender, EventArgs args)
    {
        await myObject.MyReadAsync(this.stream, this.buffer);
    }