将方法的结果调用到主线程

时间:2017-11-03 07:57:56

标签: c# wpf multithreading user-interface invoke

我想知道以下事项:

我有一个名为Container的可观察集合和名为Method的方法。

在主线程上,我想将Method的返回值添加到Container

以下代码在另一个线程上运行,因此我必须调用Container.Add到应用程序当前线程以避免错误:

object obj = Method()
App.Current.Dispatcher.Invoke(() => {
    Container.Add((MyObject)obj)
});

我的问题是我是否会这样做

App.Current.Dispatcher.Invoke(() => {
    Container.Add((MyObject)Method())
});

该方法(这是一个长时间运行的方法)将在app当前线程上运行,这不太正确,因为它将处理UI,我是否只能调用要添加到{{的方法的返回值1}}没有像第一个例子那样定义对象?

2 个答案:

答案 0 :(得分:4)

您可以使用this Invoke overload

Dispatcher.Invoke(new Action<MyObject>(o => Container.Add(o)), (MyObject)Method());

然而,您可以摆脱后台线程并在Task中调用Method。因此,您将无需调用Dispatcher.Invoke:

Container.Add(await Task.Run(() => (MyObject)Method()));

答案 1 :(得分:3)

除了@ Clemens&#39;提案,您可以使用Task-based Asynchronous Pattern (TAP)

App.Current.Dispatcher.Invoke(async () =>
{
    Container.Add(await Task.Run(() => Method()));
});

请注意,这需要 .NET 4.5 或更高版本,或 .NET 4 以及Microsoft.Bcl.Async NuGet包。