Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVVM WPF MaterialDesignInXamlToolkit中更新属性时未更新UI_C#_Wpf_Mvvm_Async Await - Fatal编程技术网

C# 在MVVM WPF MaterialDesignInXamlToolkit中更新属性时未更新UI

C# 在MVVM WPF MaterialDesignInXamlToolkit中更新属性时未更新UI,c#,wpf,mvvm,async-await,C#,Wpf,Mvvm,Async Await,这个问题被回答了很多次,但似乎有些不同。 我按照建议实现了异步命令处理程序,因此ViewModel中的命令处理程序如下所示: public async Task CommandAsync() { StatusText = "Process started..."; await myApp.LongRunningProcess().ConfigureAwait(false); StatusText = "

这个问题被回答了很多次,但似乎有些不同。 我按照建议实现了异步命令处理程序,因此ViewModel中的命令处理程序如下所示:

    public async Task CommandAsync()
    {
        StatusText = "Process started...";
        await myApp.LongRunningProcess().ConfigureAwait(false);
        StatusText = "Process finished...";
    }
问题是“流程已启动…”没有显示,它直接转到“流程已完成…”,即使我的流程运行很长时间。进程运行期间,StatusText不显示任何内容。然而,如果我加上这个微延迟,它就会像预期的那样开始工作!我不明白,为什么

    public async Task CommandAsync()
    {
        StatusText = "Process started...";
        await Task.Delay(1); <--- Now everything works!
        await myApp.LongRunningProcess().ConfigureAwait(false);
        StatusText = "Process finished...";
    }
公共异步任务CommandAsync()
{
StatusText=“流程已启动…”;
等待任务。延迟(1);
我不明白,为什么

    public async Task CommandAsync()
    {
        StatusText = "Process started...";
        await Task.Delay(1); <--- Now everything works!
        await myApp.LongRunningProcess().ConfigureAwait(false);
        StatusText = "Process finished...";
    }
很可能是因为
myApp.LongRunningProcess()
的实现不是异步的,会阻塞UI线程

这与MaterialDesignInXamlToolkit“和一些渲染细节”无关

您需要确保
myApp.LongRunningProcess()
不会阻塞

如果将
await myApp.LongRunningProcess().ConfigureAwait(false);
替换为
await Task.Delay(2000)
,然后看到“进程已启动…”消息,您就知道
myApp.LongRunningProcess()的实现确实是个问题


方法不是自动异步的,仅仅因为它返回
任务
任务

而不返回
。ConfigureAwait(false)
?相同。这没有什么区别。我添加它是为了表示我试图在单独的上下文中运行我的进程。您当然希望在异步调用完成后返回UI线程,因此不应设置ConfigureWait(false)。你能展示一下你的
LongRunningProcess
是什么样子吗?我会检查这个方法是启动新的
Task
还是调用一个在自己的任务/线程上工作的方法。我也会猜,你的
LongRunningProcess
没有正确使用任务。如果是这样,一个解决方法是使用它,比如:
Wait Task.Run()=>myApp.LongRunningProcess().GetAwaiter().GetResult());
是的,您是对的,myApp.LongRunningProcess()阻塞UI。此进程询问SQL并返回任务,其中List=await context.ToListSync()myApp通过Microsoft DI添加到ViewModel。为什么它仍然阻止UI?找到了它。这是因为EF到SQLLite的实现是同步的。Task。按照@Klamsi helps指出的运行。