最好的,线程安全的方式来访问一次字段,即处理
本文关键字:一次 处理 字段 访问 线程 安全 方式 | 更新日期: 2023-09-27 17:56:53
基本上,我想确保类中的字段(在本例中为_changedPoller)在不再需要时尽早被释放。我在类的Dispose方法中以及在某些事件发生时调用StopChangedPolling。仅释放一次字段的最佳线程安全方法是什么?下面的代码可以吗?
private void StopChangedPolling()
{
IDisposable changedPoller = Interlocked.CompareExchange(ref _changedPoller, null, _changedPoller);
if (changedPoller != null)
changedPoller.Dispose();
}
第二次调用此函数时,_changedPoller为 null 并且不会引发异常,即使文档指出如果 location1 的地址为空指针,则会抛出 ArgumentNullException。
您不是在传递空指针,而是在传递对空引用的引用。我认为你不能挑起例外
位置 1 的地址是一个空指针。
在 C# 中,因为无法在 C# 中创建空托管指针。
这是线程安全的,但在线程中止的情况下将无法释放。如果这不是您的问题,那么这很好。
您可以考虑通过使用锁来简化此代码,但我实际上认为这比锁更简单。
您也可以使用 Interlocked.Exchange
.
实际上,有一个问题:您正在以不同步的方式阅读_changedPoller
。我不确定ECMA和.NET CLR对此有什么保证。我必须阅读规范。 volatile
会解决这个问题。 如果没有其他此类读取用法,Interlocked.Exchange
也会修复它。