简单地说,我有这样的东西:
class MyClass
{
double SomeProperty {get; private set;}
public async Task SomeMethod()
{
SomeProperty = await someService.SomeAsyncMethod();
}
}
如果我同时多次调用 SomeMethod()
,SomeProperty
会损坏吗?
最佳答案
是的,有可能。
这与 async-await
没有真正的关系。您只是通过多个线程为属性设置一个值。该值可能会损坏,您应该使用一些同步结构(即 lock
):
public async Task SomeMethod()
{
var temp = await someService.SomeAsyncMethod();
lock (_lock)
{
SomeProperty = temp;
}
}
或者 Interlocked.Exchange
(使用属性的支持字段):
public async Task SomeMethod()
{
Interlocked.Exchange(ref _backingField, await someService.SomeAsyncMethod());
}
但是,如果此方法在 GUI 线程中运行(或任何其他具有单线程 SynchronizationContext
的情况),则不会发生损坏,因为只有一个线程处理该属性。
关于c# - 并发调用时可以等待损坏值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27558057/