在下面的代码中,我调用打开自定义新窗口的方法。但是,当应用程序执行一些长时间运行的任务时,我希望仍然能够激活窗口。是可以在另一个线程上使用Task
类吗?
public static class CustomW
{
static Custom_Window_Chrome_Demo.ThemedWindow MsgBox(string Msgbx_TTL, string Msgbx_Contnt)
{
var w_mbx = new Custom_Window_Chrome_Demo.ThemedWindow();
w_mbx.Width = 950; w_mbx.Height = 159;
w_mbx.Title = Msgbx_TTL;
Grid g = new Grid();
StackPanel spM = new StackPanel();
TextBlock TblckErrMsg = new TextBlock();
//more settings......
}
}
这就是我试图调用它的方式,
public void newMsgBoxShow(string Msgbx_TTL, string Msgbx_Contnt)
{
System.Threading.Thread s = new System.Threading.Thread(
()=>
CustomW.MsgBox(Msgbx_TTL, Msgbx_Contnt).Show()
);
}
但是当我使用新线程时,我收到以下错误。
调用线程必须是STA,因为许多UI组件需要此
达到所需结果的正确方法是什么?
答案 0 :(得分:2)
使用此功能:
Task.Factory.StartNew(new Action(() =>
{
//your window code
}), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
使用当前同步上下文创建新线程时,它将能够更新UI。(当前线程是UI线程时)
您还可以使用调度程序执行代码。
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(()=>
{
//your window code
}));
答案 1 :(得分:1)
看看Dispatcher
https://msdn.microsoft.com/cs-cz/library/system.windows.threading.dispatcher%28v=vs.110%29.aspx
Dispatcher.CurrentDispatcher.Invoke(delegate { /* CODE */ }, DispatcherPriority.Normal);