C#WPF机器相关并发问题
我有一个多线程的C#WPF应用程序,它是一个大型软件的插件(普林斯顿仪器LightField,适合感兴趣的人) 我的插件在与GUI分离的线程上调用同步方法。此方法来自摄影机API,从摄影机捕获n秒曝光,并返回捕获的帧 情况是这样的:C#WPF机器相关并发问题,c#,wpf,multithreading,concurrency,synchronous,C#,Wpf,Multithreading,Concurrency,Synchronous,我有一个多线程的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, RoutedEven
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)上运行得非常好。我单击Run,整个应用程序在代码运行时保持响应
但是,当我尝试在定期托管它的计算机(计算机B)上运行它时,会出现以下行为:
- 单击“运行”按钮时,GUI将对n无响应
秒(n是发送到
方法)。这对于任何正整数n都会发生,并继续作为 当循环在每个循环周期执行此方法时(即,应用程序冻结n秒,调用显示方法时有一个短暂的解冻时刻,然后应用程序再次冻结n秒)CameraAPI.CaptureImage(n);
- 如果我调用
Thread.Sleep(n)代码>代替
CameraAPI.CaptureImage(n)代码>,应用程序不会冻结
- 冻结的不仅仅是我的插件,而是整个应用程序
- 我已经构建、重建、删除并重新将代码从计算机A复制到计算机B,错误仍然存在
- 计算机A(我在那里制造的)是完全相同的(据我所知) 到出现问题的计算机(计算机B)。处理器、操作系统、, 驱动器、RAM、应用程序版本等都是相同的。计算机A 专门存在,以便可以为 计算机B
- 删除
行不会停止GUI冻结。这不是问题方法Application.Current.Dispatcher.BeginInvoke(新操作(Viewer.Display(f));
- 应用程序在每台计算机上使用相同数量的线程(43)。当插件运行时,每台计算机上的线程数量增量相同(1-4,取决于我们在程序中的位置)
这个错误行为超出了我对计算机的理解,所以现在我在这里。你知道是什么导致了这种行为上的差异吗?我们重新安装了父应用程序,一切正常。仍然不知道为什么会发生这种情况,但在问题解决后关闭了问题。一个真实的“关掉它,然后再打开。”