c# - MVVM 调度程序 UI 无响应

标签 c# wpf mvvm dispatcher

我遇到了一个可能很简单的问题:

我用 MVVM 灯构建了一个 MVVM 应用程序。

当我进行大量计算时,我的 UI 没有响应。
我需要一个调度程序,因为我想访问一些依赖对象。

我尝试使用该代码:(可能无法正常工作,因为我使用的是应用程序线程?!)

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
            {
                //LongTimeStuff
            }));

我也试过:
        DispatcherHelper.Initialize();
        DispatcherHelper.CheckBeginInvokeOnUI(() =>
        {
             //LongTimeStuff
        });

但是在这里我遇到了问题,我的依赖对象在另一个线程中。

我在一个新线程的函数中所做的所有这些事情:
   Thread CalculationThread = new Thread(this.Calculate);

谢谢!

最佳答案

Dispatcher BeginInvoke 或 InvokeAsync 不运行任何单独的线程。它仅将任务添加到任务的调度程序队列。但是调度程序队列总是在 UI 线程上处理。

这是你应该做的:

void CommandExecuted()
{
   Task.Run(() =>
   {
     //long running stuff

     Dispatcher.BeginInvoke(new Action(() =>
     {
       //access ui here
     }));
}

或使用异步模式:
    async void CommandExecuted()
    {
        await Task.Run(() =>
        {
            //long running stuff
        });
        //access ui here
    }

关于c# - MVVM 调度程序 UI 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30102671/

相关文章:

c# - 我数据库中的所有数据都是更新的。如何只更新 1 行?

c# - 将 C# 方法转换为 Java

wpf - WPF 和 silverlight 的 future 是什么?为什么有两个不同的 ui 工具包?

c# - 如何正确检查 ILogger.LogCritical 是否已使用 NSubstitute 调用?

c# - 无法将类型 'long' 隐式转换为 'int',当它似乎不涉及 `long` 类型时

WPF Mediaelement mediaopened 事件不是从后面的代码触发,而是从按钮单击处理程序触发

wpf - 使用硬件在 DeckLink 上将 YUV 转换为 RGB

silverlight - 如何将分组标题从属性名称更改为更具描述性的名称

android - livedata builder可以进行一次性操作吗?

c# - 通过 CommandParameters 返回 ViewModels 的实例