在 wpf 中,我在不同的线程中有两个窗口。
从线程 AI 中的窗口 A' 想在窗口 B' 的线程 B 中启动一个任务并等待线程 A 中的返回值。
它认为这是可能的,但如何?
你知道一个例子吗?
问问题
113 次
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.Post或SynchronizationContext.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 回答