c# - 并发调用时可以等待损坏值

标签 c# .net concurrency task-parallel-library async-await

简单地说,我有这样的东西:

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/

相关文章:

C# .NET x86/x64 哪个项目决定平台?

.net - 给定缩放级别,将long/lat转换为像素x/y

c++ - 使用 OpenGL 绘图,无需杀死 CPU 且无需并行化

php - 如何在PHP中实现事件监听

java - 如何使使用 IKVM com 创建的 .dll 可见?

java - Servlet 似乎同步处理多个并发浏览器请求

c# - 将 C# 对象存储在 SQL Server 列中

c# - C#中小数点是否为零

c# - 在 Azure 上运行时 F# 中的异常

c# - 什么时候使用存储过程优于硬编码查询?