gpt4 book ai didi

c# - 如何使公共(public)属性线程安全?

转载 作者:行者123 更新时间:2023-11-30 19:18:33 25 4
gpt4 key购买 nike

出于某种原因,我正在实现 BackgroundWorker 替换,我必须实现以下公共(public)属性:

public bool CancellationPending { get; private set; }
public bool IsBusy { get; private set; }
public bool WorkerReportsProgress { get; set; }
public bool WorkerSupportsCancellation { get; set; }

我相信您知道它们在 BackgroundWorker 中的作用。因此它们可能会被不同的线程访问/修改。我很关心如何为多线程“保护”它们。我认为将它们声明为 volatile 就足够了,但是 volatile 不能应用于自动属性。

我该怎么办?我应该为这些属性创建私有(private)字段,并将它们声明为 volatile 吗?或者我应该在每个 getset block 中使用 locking 吗?

我认为这应该是很常见的场景——使属性(最好是自动属性)线程安全。请注意,此示例中的所有属性都是原子类型。

编辑:

为了阐明我的需要:我需要确保所有线程始终读取该属性的最新值。看到这个:https://stackoverflow.com/a/10797326/1081467

再一次,你是否建议使用volatile,或locking,或其他任何东西?..当使用bool属性时,原子性是保证,所以只剩下第二个问题(读取最新值),那么你如何正确解决这个问题?当您拥有非原始类型的属性时怎么办?您是否在每个 getset block 中放置了 lock

最佳答案

我想出了以下实现。请评论您是否认为这是一个最佳解决方案:

//========== Public properties ==================================================//

public bool CancellationPending { get { return _cancellationPending; } private set { _cancellationPending = value; } }

public bool IsBusy { get { return _isBusy; } private set { _isBusy = value; } }

public bool WorkerReportsProgress { get { return _workerReportsProgress; } set { _workerReportsProgress = value; } }

public bool WorkerSupportsCancellation { get { return _workerSupportsCancellation; } set { _workerSupportsCancellation = value; } }

//========== Private fields ==================================================//

private volatile bool _cancellationPending;
private volatile bool _isBusy;
private volatile bool _workerReportsProgress;
private volatile bool _workerSupportsCancellation;

推理:字段是 bool 类型这一事实确保了原子性,因此不需要 locking。使它们成为 volatile 将确保任何线程都将读取当前值 - 而不是缓存 - 以防另一个线程修改它。我认为这是 volatile 关键字的确切目的(也是唯一有效的用途),对吧?

关于c# - 如何使公共(public)属性线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com