我想知道以下事项:
我有一个名为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}}没有像第一个例子那样定义对象?
答案 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包。