调用方法的结果到主线程
Invoking a method's result to the main thread
我想知道以下问题:
我有一个名为 Container
的可观察集合和名为 Method
的方法。
在主线程上,我想将 Method
的返回值添加到 Container
。
以下代码 运行s 在另一个线程上,所以我必须调用 Container.Add
到应用程序当前线程才能没有错误:
object obj = Method()
App.Current.Dispatcher.Invoke(() => {
Container.Add((MyObject)obj)
});
我的问题是我是否会执行以下操作
App.Current.Dispatcher.Invoke(() => {
Container.Add((MyObject)Method())
});
该方法(这是一个长 运行ning 方法)将在应用程序当前线程上 运行,这不太正确,因为它会传递 UI,我可以仅调用要添加到 Container
的方法的返回值,而不像第一个示例中那样定义对象?
您可以使用 this Invoke overload:
Dispatcher.Invoke(new Action<MyObject>(o => Container.Add(o)), (MyObject)Method());
然而,您可以摆脱后台线程并在 Task
中调用方法。因此,您将避免调用 Dispatcher.Invoke:
Container.Add(await Task.Run(() => (MyObject)Method()));
替代@Clemens 的建议,您可以使用 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 包.
我想知道以下问题:
我有一个名为 Container
的可观察集合和名为 Method
的方法。
在主线程上,我想将 Method
的返回值添加到 Container
。
以下代码 运行s 在另一个线程上,所以我必须调用 Container.Add
到应用程序当前线程才能没有错误:
object obj = Method()
App.Current.Dispatcher.Invoke(() => {
Container.Add((MyObject)obj)
});
我的问题是我是否会执行以下操作
App.Current.Dispatcher.Invoke(() => {
Container.Add((MyObject)Method())
});
该方法(这是一个长 运行ning 方法)将在应用程序当前线程上 运行,这不太正确,因为它会传递 UI,我可以仅调用要添加到 Container
的方法的返回值,而不像第一个示例中那样定义对象?
您可以使用 this Invoke overload:
Dispatcher.Invoke(new Action<MyObject>(o => Container.Add(o)), (MyObject)Method());
然而,您可以摆脱后台线程并在 Task
中调用方法。因此,您将避免调用 Dispatcher.Invoke:
Container.Add(await Task.Run(() => (MyObject)Method()));
替代@Clemens 的建议,您可以使用 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 包.