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

本文关键字:一次 处理 字段 访问 线程 安全 方式 | 更新日期: 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也会修复它。