最好的,线程安全的方式来访问一次,即处置

时间:2015-06-18 14:25:29

标签: c# multithreading dispose interlocked

基本上我想确保一个类中的字段(在这种情况下是_changedPoller)在不再需要时尽早处理。我在课堂上叫StopChangedPolling'处理方法以及何时发生某些事件。只处理一次字段的最佳,线程安全方法是什么?以下代码是否正常?

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

第二次调用它时,_changedPoller为null并且不会引发异常,即使文档声明如果location1的地址是空指针也会抛出ArgumentNullException。

1 个答案:

答案 0 :(得分:2)

您没有传递空指针,您正在传递对空引用的引用。我认为你不能引发异常

  

location1的地址是空指针。

在C#中

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

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

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

您也可以使用Interlocked.Exchange

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