一次访问字段的最佳线程安全方式,即用于处理

Best, thread safe way to access a field once i.e. for disposal

基本上我想确保 class 中的字段(在本例中为 _changedPoller)在不再需要时尽早处理。我在 class' Dispose 方法中调用 StopChangedPolling 并在某些事件发生时调用。仅处理一次字段的最佳线程安全方法是什么?下面的代码可以吗?

private void StopChangedPolling()
{
    IDisposable changedPoller = Interlocked.CompareExchange(ref _changedPoller, null, _changedPoller);
    if (changedPoller != null)
        changedPoller.Dispose();
}

第二次调用时,_changedPoller 为 null 并且没有抛出异常,即使文档指出如果 location1 的地址为空指针则抛出 ArgumentNullException。

您传递的不是空指针,而是对空引用的引用。我不认为你能引发异常

The address of location1 is a null pointer.

在 C# 中,因为无法在 C# 中创建空托管指针。

这是线程安全的,但在线程中止的情况下将无法处理。如果这不是您关心的问题,那么这很好。

您可以考虑使用锁来简化此代码,但实际上我认为这比锁更简单。

您也可以使用 Interlocked.Exchange.

实际上,有一个问题:您正在以一种不同步的方式阅读 _changedPoller。我不确定 ECMA 和 .NET CLR 对此有何保证。我将不得不阅读规范。 volatile 会解决这个问题。 Interlocked.Exchange 如果没有其他此类读取用法,也会修复它。