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开头的代码部分代码>将在同一线程上执行,对吗
this.count+=read代码>应该使用适当的线程同步原语进行保护,对吗
是的,你说得对。为了避免任何线程同步问题,您应该在增加计数的行周围应用适当的锁定谢谢,据我所知,到目前为止,没有人懒得提及使用ConfigureWait(false)可能需要线程同步。我认为这不是每个人都能立即看到的,因此可能会导致许多难以发现的错误。在这种情况下,联锁而不是锁定就足够了。我认为您应该首先问一个问题:
Stream
s甚至支持在另一个读取仍在进行时启动新的读取吗?这样做有意义吗?@svick:即使流在第一次读取完成之前不开始第二次读取,也会有竞争条件。
private async void OnWhatever(object sender, EventArgs args)
{
await myObject.MyReadAsync(this.stream, this.buffer);
}