C#WPF-从工作线程访问在UI线程上创建的对象而不会阻塞

时间:2018-11-12 12:21:30

标签: c# wpf multithreading

我正在开发一个插件WPF应用程序,该应用程序是从较大的应用程序实例化的,并定期与主应用程序的API接口。我的问题是,每当与主应用程序进行大量操作时,插件UI就会被阻止。 为了解决这个问题,我执行了一个任务,并使用UI的SynchronizationContext来调用访问主应用程序的操作。 出于测试目的,我有一个简单的WPF应用程序MainWindow并按如下所示设置视图模型的ViewContext

((MainWindowViewModel)DataContext).ViewContext = SynchronizationContext.Current;

然后在我的视图模型中,我从一个任务执行如下密集操作。

public void BeginTaskWork()
{
    Task.Factory.StartNew(() =>
    {
        ViewContext.Post(new SendOrPostCallback((o) =>
        {
            PerformIntensiveOperation();
        }), null);
    }
}

这克服了从任务调用UI线程上的对象的障碍,但不会阻止UI挂起。

我想这是可以预期的,因为我仍在UI线程上执行繁重的任务。

因此,基本上,我在问是否有什么事情可以防止在尝试执行与父应用程序接口的操作时阻止UI阻塞。

更新:

为澄清起见,密集操作涉及到访问父应用程序的API,而该API由UI线程拥有。

此外,当我只是尝试在另一个线程或任务上执行此操作时,也会收到错误消息“ System.InvalidOperationException:调用线程无法访问该对象,因为另一个线程拥有它。”这就是我尝试将任务和同步上下文结合在一起的原因。

谢谢。

1 个答案:

答案 0 :(得分:0)

在另一个线程中执行密集操作。这不会阻止UI。如果您需要从另一个线程调用UI线程上的对象,而不是确切地-在UI线程上调用它们。您可以通过在当前调度程序上执行调用来实现。

firebase.firestore().collection("collectionName").doc().id
相关问题