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'只在调试时出现。打印目的。
任何帮助都非常感谢,如果你需要更多的代码片段,或者如果我对任何事情不清楚,请问,我会尽快回应。
终于弄明白是怎么回事了。我一直专注于我认为我有错误的事实,我如何控制我的线程。这似乎是测试需要运行的设备上的CPU问题。似乎有时如果没有足够的CPU可用,MediaElement将无法创建,所以我使用的测试视频只是质量太高,所以它只在某些时候工作,并且由于某种原因,CPU使用率在第二次测试运行时总是稍微低一些。
我会留下这个问题,以防其他人碰巧有MediaElement未加载的问题。我使用这个程序来强调我的CPU,所以我可以可靠地使我的程序"崩溃"MediaElement,以验证它是当CPU负载太高时,它不会创建元素。(视视频质量而定)
http://alax.info/blog/1342/comment-page-1这帮助我得出了我的结论,当一个用户使用多个MediaElements并遇到与我相同的问题时,上述软件也被另一个用户"Roman R"链接:黑色视频使用多个实例VMR 9