任务<string>方法

时间:2015-12-24 21:22:58

标签: c# wpf multithreading

我必须实现返回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#中的线程没有很好的理解。

2 个答案:

答案 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));
}