所以我遇到了一个奇怪的情况。我已成功使用模式一段时间来在2个线程之间传递数据。假设有2个主题:
线程A(GUI线程) 线程B(在后台轮询设备中的数据)
线程B正在执行PollStatus函数,然后将线程休眠一段时间。当它获取数据时,它会在线程A中引发一个委托事件,该事件将返回到线程A以使用数据更新某些标签。
线程代码:
private delegate void LabJackUSB_OnDataAvailableCallback(LabJackRef.Status LabJackStatus);
private void LabJackUSB_OnDataAvailable(LabJackRef.Status LabJackStatus)
{
if (this.InvokeRequired)
{
this.Invoke(new LabJackUSB_OnDataAvailableCallback(LabJackUSB_OnDataAvailable), new object[] { LabJackStatus });
}
else
{
// Do something with data here
}
}
线程B代码:
public delegate void DataAvailable(LabJackRef.Status LabJackStatus);
public event DataAvailable OnDataAvailable;
private bool PollStatus(StepDefinition CurrentStep)
{
GetData();
AnnounceDataAvailable();
return false;
}
private void AnnounceDataAvailable()
{
if (OnDataAvailable != null)
{
OnDataAvailable(USBStatus);
}
}
线程是执行步骤的while循环,然后休眠线程。 while循环继续,直到状态机执行其关闭步骤并将WorkerState.StateMachineComplete标志设置为true,此时while循环退出并且线程应该关闭。
protected void Worker(object Worker)
{
while (true)
{
// see if we are waiting to close the thread
if (((ThreadInfo)Worker).CloseThread)
{
// set flag to exit worker when complete
WorkerState.ThreadClosing = true;
// if we have finished closing the state machine,
// we can exit the while loop to close the thread
if (WorkerState.StateMachineComplete)
break;
// otherwise, jump to the last step
StateMachine.JumpToLast(WorkerStateMachine);
}
// run the state machine
StateMachine.ExecuteStep(WorkerStateMachine, WorkerState);
// wait for the time defined in the current step
((ThreadInfo)Worker).WaitHandle.WaitOne(WorkerState.DelayTimeMS);
}
}
现在这种情况在多种情况下都很好(没有问题)。出于某种原因,当我是us我们的通告函数它不会关闭,但while循环内没有断点将停止调试器。对我而言,这意味着while循环不再循环,但我不知道这是怎么回事。我的应用程序中没有任何未处理的异常,因此没有线索。
如果我只是注释掉announce函数,那么线程就没有问题,所以我知道代码中没有问题来获取数据或设置标签。
如果我注释掉了对数据做任何事情的线程A部分,那么错误仍然存在,但如果我没有订阅线程A中的事件,它将正常关闭。
老实说,我甚至不知道如何开始调试,因为调试器无法在等待关闭的循环中的任何地方停止。
任何想法都将不胜感激!
谢谢, 约翰维克斯