C# 一次访问字段(即进行处置)的最佳线程安全方式
基本上,我希望确保在不再需要时尽早处理类中的字段(在本例中为_changedPoller)。当某些事件发生时,我在类的Dispose方法中调用StopChangedPolling。哪种线程安全的方式可以一次性处理一个字段?下面的代码可以吗C# 一次访问字段(即进行处置)的最佳线程安全方式,c#,multithreading,dispose,interlocked,C#,Multithreading,Dispose,Interlocked,基本上,我希望确保在不再需要时尽早处理类中的字段(在本例中为_changedPoller)。当某些事件发生时,我在类的Dispose方法中调用StopChangedPolling。哪种线程安全的方式可以一次性处理一个字段?下面的代码可以吗 private void StopChangedPolling() { IDisposable changedPoller = Interlocked.CompareExchange(ref _changedPoller, null, _changed
private void StopChangedPolling()
{
IDisposable changedPoller = Interlocked.CompareExchange(ref _changedPoller, null, _changedPoller);
if (changedPoller != null)
changedPoller.Dispose();
}
第二次调用它时,\u changedPoller为null,并且不会引发异常,即使文档说明如果location1的地址为null指针,则会引发ArgumentNullException。您不是传递null指针,而是传递对null引用的引用。我认为你不能挑起这个例外 location1的地址是空指针 在C#中,因为不能在C#中创建空的托管指针 这是线程安全的,但在线程中止时将无法处理。如果这不是你关心的问题,那么这是好的 <>你可以考虑用锁来简化这个代码,但实际上我认为这比锁简单。 您还可以使用
联锁.Exchange
实际上,有一个问题:您正在以一种不同步的方式阅读
\u changedPoller
。我不确定ECMA和.NET CLR对此有何保证。我必须阅读规范。volatile
可以解决这个问题Interlocated.Exchange
也会修复它,如果没有其他这样的读取用法。在这种情况下,您可以使用Interlocated.Exchange
而不是CompareeExchange
您正在以非同步的方式读取\u changedPollerInterlocated方法不应该使用内存屏障吗,但是其中一个参数就是\u changedPoller
。这是一个正常的读数。哦,接得好。即使使用volatile,这里也存在赛车条件<代码>互锁。交换肯定应该用,而不是用这个东西。这个东西又硬又易碎。起初我忽略了这一点。现在我建议使用锁似乎更明智了。