6

次のコードを検討してください。

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;
    }
}

次のように、このMyReadAsyncメソッドが WPF アプリケーションのイベント ハンドラーから直接呼び出されるとします。

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

ここに私の質問があります:

  1. を使用ConfigureAwait(false)すると、行で始まるコードの部分をthis.count += read;任意のスレッドプール スレッドで実行できますよね?
  2. の 2 つの別々の呼び出しのMyReadAsync場合、コードの で始まる部分がthis.count += read;同じスレッドで実行されるという保証はありませんよね?
  3. this.count += read;1 と 2 が正しければ、適切なスレッド同期プリミティブでコードを保護する必要があるように思えますね。
4

1 に答える 1

3

はい。それで合っています。スレッド同期の問題を回避するには、カウントを増やしている行の周りに適切なロックを適用する必要があります

于 2012-12-07T11:45:11.327 に答える