Ibr*_*jar 2 .net c# concurrency task-parallel-library async-await
简而言之,我有这样的事情:
class MyClass
{
double SomeProperty {get; private set;}
public async Task SomeMethod()
{
SomeProperty = await someService.SomeAsyncMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
SomeProperty如果我SomeMethod()同时多次打电话可能会被破坏?
是的,可能.
这与真正无关async-await.您只需通过多个线程为属性设置值.该值可能会被破坏,您应该使用一些同步构造(即lock):
public async Task SomeMethod()
{
var temp = await someService.SomeAsyncMethod();
lock (_lock)
{
SomeProperty = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
或者Interlocked.Exchange(使用属性的支持字段):
public async Task SomeMethod()
{
Interlocked.Exchange(ref _backingField, await someService.SomeAsyncMethod());
}
Run Code Online (Sandbox Code Playgroud)
但是,如果此方法在GUI线程(或任何其他具有单线程的情况SynchronizationContext)中运行,则不存在损坏的可能性,因为只有一个线程处理该属性.