0

在 wpf 中,我在不同的线程中有两个窗口。
从线程 AI 中的窗口 A' 想在窗口 B' 的线程 B 中启动一个任务并等待线程 A 中的返回值。
它认为这是可能的,但如何?
你知道一个例子吗?

4

2 回答 2

5

多个 WPF UI 线程是一个非常高级的场景。

您应该可以通过让线程 B 公开任务工厂来做到这一点:

 TaskFactory _taskFactory;
 public TaskFactory TaskFactory { get { return _taskFactory; } }

在线程 B 的启动中的某个时刻,执行以下操作:

 // Startup code running on Thread B
 _taskFactory = new TaskFactory(
     TaskScheduler.FromCurrentSynchronizationContext());

然后您可以从线程 A 使用工厂,允许线程 A(或任何人)将工作排队到线程 B:

 await _threadB.TaskFactory.StartNew(() =>
 {
   ...
 });
于 2013-12-04T15:35:23.677 回答
0

据我了解,实际问题是当两个窗口在单独的线程中运行时,如何从窗口 A 对窗口 B 启动操作。

在这种情况下,您可以使用SynchronizationContext.PostSynchronizationContext.Send在第二个窗口的同步上下文上启动操作,而无需启动任务。Send 会阻塞调用线程,直到回调被处理,而 Post 会立即返回。这使得 Post 更适合该场景。

最终结果与在线程 B 上创建任务相同。回调将在线程 B 上执行,但现在您避免了创建和调度任务的工作,并且它需要的代码更少。

为了使这个整洁,您可以在创建 Window B 的新实例并在 Windows B 的包装器方法中使用它时存储对当前同步上下文的引用:

public partial class WindowB : Window
{
    private SynchronizationContext _context;

    ...

    protected override void OnActivated(EventArgs e)
    {
        base.OnActivated(e);
        _context = SynchronizationContext.Current;
    }

    public void PostAction(string data)
    {
        _context.Post(ActualAction,data);
    }

    private void ActualAction(object state)
    {
        Title = state.ToString();

    }
}
于 2013-12-06T10:59:08.863 回答