在下面的代码中,我调用了打开自定义新窗口的方法。但是,当应用程序正在执行一些长时间运行的任务时,我希望仍然能够激活窗口。是否可以在另一个线程上或使用 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()
);
}
但是当我使用新线程时出现以下错误。
The calling thread must be STA, because many UI components require this
获得所需结果的正确方法是什么?
最佳答案
使用这个:
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
}));
关于c# - WPF 在另一个线程上打开新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35270032/