WPF辅助UI线程MediaElement不会在第一次运行时加载

本文关键字:第一次 运行时 加载 辅助 UI 线程 MediaElement WPF | 更新日期: 2023-09-27 18:11:16

我有一个程序,应该测试各种设置在windows图像。每个测试被标记为一个"插件"。现在我所有的插件都在使用ThreadPool.QueueUserWorkItem的工作线程中运行。

当我们想要测试用户输入时,出现了一个问题,他/她必须测试设备的声音/视频和触摸屏。为了测试这一点,我在我的一个插件类中创建了第二个WPF窗口,因此这个插件打开该窗口,等待用户输入,然后关闭。这个窗口由一个标签、3个单选按钮、一个MediaElement和几个按钮组成。

当我打开我的应用程序时,它加载了我所有的。dll文件,然后我可以选择按下我的"运行测试"按钮,它会运行我的插件列表并运行它们。

现在,因为我们需要这个用户交互线程,我需要它不同于ThreadPool线程。下面的代码显示了我如何启动我所有的线程,第一部分是用户交互插件。代码是混乱的,因为我已经测试了几个解决方案,一些我试图合并到其他…

if (availablePlugin.RequirementNumber.Equals("13996"))
          {
            try
            {
              plugin.Status = VerdictEnum.InProgress;
//              var uiThread = new Thread(plugin.TestMethod);
              Action startUIThread = () =>
              {
                Thread uiThread = new Thread(new ThreadStart(() =>
                {
                  SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
                  plugin.TestMethod();
                }));
                uiThread.SetApartmentState(ApartmentState.STA);
                uiThread.IsBackground = true;
                uiThread.Start();
                uiThread.Join();
              };
              Dispatcher.CurrentDispatcher.Invoke(startUIThread);
            }
            catch (Exception ex)
            {
              uiContext.Post(
                (o) => plugin.ErrorDescription += "Test case threw an unexpected exception: " + ex.Message, null);
              uiContext.Post((o) => plugin.Status = VerdictEnum.Inconclusive, null);
            }
            finally
            {
              //Once the thread has finished it sets its personal ManualResetEvent to true, indicating it has finished its job
              numberOfRunningThreads--;
              eventlist[localCounter].Set();
              Debug.Print("TEST ENDED");
            }
          }
          //All other tests are created as worker threads using the ThreadPool.
          else
          {
            ThreadPool.QueueUserWorkItem(
              new WaitCallback(s =>
              {
                try
                {
                  plugin.Status = VerdictEnum.InProgress;
                  plugin.TestMethod();
                }
                catch (Exception ex)
                {
                  uiContext.Post(
                    (o) => plugin.ErrorDescription += "Test case threw an unexpected exception: " + ex.Message, null);
                  uiContext.Post((o) => plugin.Status = VerdictEnum.Inconclusive, null);
                }
                finally
                {
                  //Once the thread has finished it sets its personal ManualResetEvent to true, indicating it has finished its job
                  numberOfRunningThreads--;
                  eventlist[localCounter].Set();
                  Debug.Print("TEST ENDED");
                }
              }));
          }

看看我如何在插件类中展示我的窗口:

        var videoAudioTest = new VideoAudioPopup();
        videoAudioTest.Show();
        videoAudioTest.ResultReady += videoAudioTest_ResultReady;
        //        videoAudioTest.Closed += (s, e) => System.Windows.Threading.Dispatcher.ExitAllFrames();
        //        videoAudioTest.Closed += (s, e) => Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
        videoAudioTest.Closed += (s, e) => Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

        Dispatcher.Run();

有趣的部分来了。当我在我的电脑上运行这个测试时,一切正常,没有任何问题。我从来没有遇到过加载MediaElement失败的情况。

当我在需要测试的设备上运行我的应用程序时,它将(几乎,它有几次)在第一次运行时(我第一次按下"运行测试"按钮)永远不会工作。如果我保持应用程序打开,并再次按"运行测试"按钮,它总是工作的。

为MediaElement加载的视频是W7标准的afaik 'Wildlife.wmv'。媒体播放器本身在外部运行时不会出现任何问题。

我假设这是发生的,因为我搞砸了我的线程?-正如所说的代码是有点乱,现在,我已经尝试了一些其他的方法,已经在我的电脑上工作,但它从来没有像预期的设备上工作,他们几乎总是有麻烦加载MediaElement在新的窗口。

'numberofrunningthreads'只在调试时出现。打印目的。

任何帮助都非常感谢,如果你需要更多的代码片段,或者如果我对任何事情不清楚,请问,我会尽快回应。

WPF辅助UI线程MediaElement不会在第一次运行时加载

终于弄明白是怎么回事了。我一直专注于我认为我有错误的事实,我如何控制我的线程。这似乎是测试需要运行的设备上的CPU问题。似乎有时如果没有足够的CPU可用,MediaElement将无法创建,所以我使用的测试视频只是质量太高,所以它只在某些时候工作,并且由于某种原因,CPU使用率在第二次测试运行时总是稍微低一些。

我会留下这个问题,以防其他人碰巧有MediaElement未加载的问题。我使用这个程序来强调我的CPU,所以我可以可靠地使我的程序"崩溃"MediaElement,以验证它是当CPU负载太高时,它不会创建元素。(视视频质量而定)

http://alax.info/blog/1342/comment-page-1

这帮助我得出了我的结论,当一个用户使用多个MediaElements并遇到与我相同的问题时,上述软件也被另一个用户"Roman R"链接:黑色视频使用多个实例VMR 9