不冻结:WPF MVVM等待方法阻塞UI,同时与模拟等待当我跟着我的UI任务迟迟不
XAML绑定:
<Button Command="{Binding LongRunningCommand}" />
视图模型:
ctor
{
LongRunningCommand = new DelegateCommand<object>(ProcessLongRunningCommand);
}
public DelegateCommand LongRunningCommand { get; private set; }
private async void ProcessLongRunningCommand(object e)
{
await Task.Delay(5000);
}
但是,如果我用真正的方法替换Task.Delay,那么我的UI 冻结。这太奇怪了。看看下面的例子:
XAML绑定:
<Button Command="{Binding LongRunningCommand}" />
视图模型:
private readonly IDbAccess _dbAccess;
ctor(IDbAccess dbAccess)
{
_dbAccess = dbAccess
LongRunningCommand = new DelegateCommand<object>(ProcessLongRunningCommand);
}
public DelegateCommand LongRunningCommand { get; private set; }
private async void ProcessLongRunningCommand(object e)
{
var callResult = await _dbAccess.LongRunningMethod();
//adjust viewmodel observablecollection property which binds to a ListBox with callResult
}
DBACCESS IMPL:
public Task LongRunningMethod(object e)
{
return Task.Run(() =>
{
...
}
}
有人可以看到我在做什么错了,请,我在这上面花了很多时间...
顺便说一句,我知道async void
不是一个最佳做法,但我找不到解决方案,使DelegateCommand异步。
编辑
更多的研究后,我们得出的结论是,这是一个“渲染”的问题。 LongRunningCommand是异步的,但渲染和绑定需要时间并阻止UI。我不知道如何解决这个渲染问题。
它可以冻结的情况下_adjust viewmodel observablecollection与callResult_做一些沉重的UI更新 – Fabio
我只是用200个结果填充observablecollection它阻止我的窗口。我不能移动窗口,也不能调整大小1秒。 – Ozkan
你有看过[这篇文章来自MSDN](https://msdn.microsoft.com/en-gb/magazine/dn630647.aspx)吗? – XAMlMAX