C# 在MVVM WPF MaterialDesignInXamlToolkit中更新属性时未更新UI
这个问题被回答了很多次,但似乎有些不同。 我按照建议实现了异步命令处理程序,因此ViewModel中的命令处理程序如下所示: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 = "
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指出的运行。