次のコードを検討してください。
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);
}
ここに私の質問があります:
- を使用
ConfigureAwait(false)
すると、行で始まるコードの部分をthis.count += read;
任意のスレッドプール スレッドで実行できますよね? - の 2 つの別々の呼び出しの
MyReadAsync
場合、コードの で始まる部分がthis.count += read;
同じスレッドで実行されるという保証はありませんよね? this.count += read;
1 と 2 が正しければ、適切なスレッド同期プリミティブでコードを保護する必要があるように思えますね。