【问题标题】:WPF Open window in Task<string> methodWPF 在 Task<string> 方法中打开窗口
【发布时间】:2015-12-27 18:01:01
【问题描述】:

我必须实现返回任务的方法。

Task<string> Method() {}

这个函数的内部实现我要打开窗口

MyWindow form = new MyWindow();
form.ShowDialog();
return form.MyProperty;

当我试图打开时,我得到了

“调用线程必须是STA,因为很多UI组件都需要这个。”

当我尝试时

var task= = Task.Factory.StartNew<string>(() =>
{
    MyWindow form = new MyWindow();
    form.ShowDialog();
    return form.MyProperty;
},CancellationToken.None,
   TaskCreationOptions.None,
   TaskScheduler.FromCurrentSynchronizationContext());

我明白了

“当前的 SynchronizationContext 不能用作 TaskScheduler”。

我做错了什么?我对 C# 中的线程不太了解。

【问题讨论】:

  • I do not have good understanding of threading in C# 我想这是问题的一部分。线程非常困难。

标签: c# wpf multithreading


【解决方案1】:

如果你想让你的任务包含 WPF 相关的操作,你需要使用 WPF Dispatcher,因为 Task API 本质上是 MTA,而 WPF 是 STA,而 WPF 是一个 UI 线程。 UI 线程(WPF 和 Windows 窗体)和普通的 Task 或简单的 System.Thread 不能一次性混合使用,即使使用 Task API。

在与普通线程混合之前,您应该研究 WPF 中如何处理线程。有关 WPF Dispatcher 的更多信息,请访问:https://msdn.microsoft.com/en-us/library/ms741870(v=vs.100).aspx

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多