C#WPF机器相关并发问题

时间:2016-06-08 22:39:45

标签: 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, 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),会出现以下行为:

  • 单击“运行”按钮时,GUI对n无响应 秒(n是发送到CameraAPI.CaptureImage(n);的时间 方法)。对于任何正整数n都会发生这种情况并继续作为 while循环在每个循环周期执行此方法(即应用程序冻结n秒,在调用Display方法时有一个短暂的解冻时刻,然后应用程序再次冻结n秒)。
  • 如果我拨打Thread.Sleep(n);来代替 CameraAPI.CaptureImage(n);,应用程序不会冻结。
  • 这不仅仅是我的插件冻结 - 它是整个应用程序。
  • 我已将计算机A中的代码构建,重建,删除并重新复制到计算机B,错误仍然存​​在。
  • 计算机A(我建的这个)是完全相同的(据我所知) 到具有问题的计算机(计算机B)。处理器,操作系统, 驱动器,RAM,应用程序版本等都是一样的。电脑A. 特别存在,以便可以开发应用程序 电脑B.
  • 删除Application.Current.Dispatcher.BeginInvoke(new Action(Viewer.Display(f));行并不会阻止GUI冻结。这不是问题方法。
  • 应用程序在每台计算机上使用相同数量的线程(43)。当插件运行时,每台计算机上的线程数增加相同的数量(1-4取决于我们在程序中的位置)。

因此,在两个看似相同的系统上,相同的代码具有不同的结果。在系统A上,它按预期工作(没有GUI冻结),而在系统B上,整个应用程序的GUI - 不仅仅是我正在编写的插件 - 每次调用同步方法时都会冻结。

这种错误行为超出了我对计算机的理解,所以现在我来了。关于造成这种行为差异的原因的任何想法?

1 个答案:

答案 0 :(得分:0)

我们重新安装了父应用程序,一切正常。仍然不知道为什么会发生这种情况,但是问题解决之后关闭了问题。一个真实的案例"将其关闭并重新打开。"