我必须实现返回Task的方法。
Task<string> Method() {}
这个函数的内部实现我想打开窗口
MyWindow form = new MyWindow();
form.ShowDialog();
return form.MyProperty;
试图打开时我得到了
&#34;调用线程必须是STA,因为许多UI组件都需要这个。&#34;
当我试图
时var task= = Task.Factory.StartNew<string>(() =>
{
MyWindow form = new MyWindow();
form.ShowDialog();
return form.MyProperty;
},CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
我得到了
&#34;当前的SynchronizationContext不能用作TaskScheduler&#34;。
我做错了什么?我对C#中的线程没有很好的理解。
答案 0 :(得分:1)
如果您希望让任务包含与WPF相关的操作,则需要使用WPF Dispatcher,因为Task API本质上是MTA,而WPF是STA,而WPF是UI线程。 UI线程(WPF和Windows Forms)和普通的Task或简单的System.Thread即使使用Task API也不能一气呵成。
在与普通线程混合之前,你应该研究如何在WPF中处理线程。有关WPF Dispatcher的更多信息,请访问:https://msdn.microsoft.com/en-us/library/ms741870(v=vs.100).aspx
答案 1 :(得分:0)
执行GUI线程操作时尝试此操作。
if (Application.Current.Dispatcher.CheckAccess()){
GUI code.
}
else{
Application.Current.Dispatcher.Invoke(new System.Action(() => yourMethod));
}