Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一次访问字段(即进行处置)的最佳线程安全方式_C#_Multithreading_Dispose_Interlocked - Fatal编程技术网

C# 一次访问字段(即进行处置)的最佳线程安全方式

C# 一次访问字段(即进行处置)的最佳线程安全方式,c#,multithreading,dispose,interlocked,C#,Multithreading,Dispose,Interlocked,基本上,我希望确保在不再需要时尽早处理类中的字段(在本例中为_changedPoller)。当某些事件发生时,我在类的Dispose方法中调用StopChangedPolling。哪种线程安全的方式可以一次性处理一个字段?下面的代码可以吗 private void StopChangedPolling() { IDisposable changedPoller = Interlocked.CompareExchange(ref _changedPoller, null, _changed

基本上,我希望确保在不再需要时尽早处理类中的字段(在本例中为_changedPoller)。当某些事件发生时,我在类的Dispose方法中调用StopChangedPolling。哪种线程安全的方式可以一次性处理一个字段?下面的代码可以吗

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,这里也存在赛车条件<代码>互锁。交换肯定应该用,而不是用这个东西。这个东西又硬又易碎。起初我忽略了这一点。现在我建议使用锁似乎更明智了。