我需要在主UI线程的单独线程上启动一个窗口。这不理想,我知道这不正常。
新窗口按如下方式启动:
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
var thread = new Thread(() =>
{
var w = new ScrollingBanner(300,70,0,0);
w.Show();
w.Name = "BannerThread";
w.Closed += (sender2, e2) => w.Dispatcher.InvokeShutdown();
Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
这将启动窗口并执行我需要的操作。
此(线程)UI的Window上的控件调用我正在窗口后面的代码中侦听的事件,如下所示:
private void ContentTicker_OnScrollComplete(object sender, EventArgs e)
{
Debug.WriteLine("Scroller Ended");
try
{
if (CheckAccess())
{
sliderText.Text = "Updated Text";
}
else
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new Action(() => sliderText.Text = "Updated Text"));
}
}
catch (Exception ex)
{
//breakpoint
}
}
从运行控件的后台线程调用ContentTicker_OnScrollComplete。
我得到一个例外,一个不同的线程拥有该控件;但据我所知,我正在调用Dispatcher在正确的线程上执行操作。 (如果我在主UI线程上执行所有操作,则可以正常工作)
如何在正确的线程上更新“sliderText”?
由于
答案 0 :(得分:3)
替换它:
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new Action(() => sliderText.Text = "Updated Text"))
为此:
Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new Action(() => sliderText.Text = "Updated Text"))
因为Application.Current.Dispatcher
将返回“主”调度程序,而不是“辅助”调度程序。