gpt4 book ai didi

C#线程访问if block ,其条件返回false

转载 作者:行者123 更新时间:2023-11-30 20:47:59 24 4
gpt4 key购买 nike

这段代码被很多线程访问

    // All code is from same class

public void ExecuteCommand(IAsciiCommand command, IAsciiCommandSynchronousResponder responder)
{
lock (commander)
{
if (commander.IsConnected)
{
commander.ExecuteCommand(command, responder);
}
}
}

public void Disconnect()
{
var tmp = commander.IsConnected;
commander.Disconnect();
if (commander.IsConnected != tmp && !commander.IsConnected)
{
OnPropertyChanged("IsConnected");
}
}

最终我得到了这个:Error

这怎么可能,那个线程访问到 if 语句,其条件返回 false?我该如何解决?

最佳答案

发生这种情况是因为检查和调用缺乏原子性。以下是可能导致异常的一系列事件:

  • 两个线程A和B同时达到条件
  • 线程A检查条件,返回true,因此进入if block
  • 同时线程调度器判断线程A已耗尽其时隙,将其挂起
  • 线程 B 调用 Disconnect
  • 线程调度程序恢复线程 A,它在 if 条件内。但是,命令不再连接
  • 这会导致异常

您可以通过在 Disconnect() 中锁定 commander 来修复它。

public void Disconnect()
{
bool doEvent;
lock(commander) {
var tmp = commander.IsConnected;
commander.Disconnect();
doEvent = (commander.IsConnected != tmp && !commander.IsConnected)
}
// Run OnPropertyChanged outside the locked context
if (doEvent)
{
OnPropertyChanged("IsConnected");
}
}

关于C#线程访问if block ,其条件返回false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com