可以等待同时调用时损坏值

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()同时多次打电话可能会被破坏?

i3a*_*non 6

是的,可能.

这与真正无关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)中运行,则不存在损坏的可能性,因为只有一个线程处理该属性.