我有一个多线程C#WPF应用程序,它是一个大型软件的插件(普林斯顿仪器LightField,对于那些感兴趣的人)。
我的插件在与GUI分离的线程上调用同步方法。此方法来自相机API,从相机捕获n秒曝光并返回捕获的帧。
情况看起来像这样:
private static volatile bool _STOP = true;
// Runs when the "Run" button is clicked
private void Run_Click(object sender, RoutedEventArgs e)
{
object time = InputTime.Text; // a non-negative integer provided by the user
_STOP = false;
Thread run_thread = new Thread(Running);
run_thread.Start(time);
}
// Runs when the "Stop" button is clicked
private void Stop_Click(object sender, RoutedEventArgs e)
{
_STOP = true;
}
// Separate Thread from GUI
private void Running(object t)
{
int time = Convert.ToInt32(t);
FrameObject f;
while(!_STOP)
{
// synchronously capture a t-second exposure
f = CameraAPI.CaptureImage(t);
// display the exposure on a viewer controlled by the parent thread
Application.Current.Dispatcher.BeginInvoke(new Action(Viewer.Display(f));
}
}
这个代码(或者更确切地说,它是更复杂的兄弟代码)在我开发它的计算机(计算机A)上运行得非常好。我单击“运行”,整个应用程序在代码运行时保持响应。
但是,当我尝试在将要定期托管它的计算机上运行它时(计算机B),会出现以下行为:
CameraAPI.CaptureImage(n);
的时间
方法)。对于任何正整数n都会发生这种情况并继续作为
while循环在每个循环周期执行此方法(即应用程序冻结n秒,在调用Display方法时有一个短暂的解冻时刻,然后应用程序再次冻结n秒)。Thread.Sleep(n);
来代替
CameraAPI.CaptureImage(n);
,应用程序不会冻结。Application.Current.Dispatcher.BeginInvoke(new Action(Viewer.Display(f));
行并不会阻止GUI冻结。这不是问题方法。因此,在两个看似相同的系统上,相同的代码具有不同的结果。在系统A上,它按预期工作(没有GUI冻结),而在系统B上,整个应用程序的GUI - 不仅仅是我正在编写的插件 - 每次调用同步方法时都会冻结。
这种错误行为超出了我对计算机的理解,所以现在我来了。关于造成这种行为差异的原因的任何想法?
答案 0 :(得分:0)
我们重新安装了父应用程序,一切正常。仍然不知道为什么会发生这种情况,但是问题解决之后关闭了问题。一个真实的案例"将其关闭并重新打开。"