をしません待つ凍結しない:のWPF MVVM私は私のUIを次の手順を実行した場合、タスクの遅延が
XAMLバインディング:
<Button Command="{Binding LongRunningCommand}" />
のviewmodel:
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 はフリーダイヤルです。これはとても奇妙です。例えば下記をご覧:
<Button Command="{Binding LongRunningCommand}" />
のviewmodel:
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:結合
XAML
public Task LongRunningMethod(object e)
{
return Task.Run(() =>
{
...
}
}
は誰かが、私が間違ってやって見せて下さい。私はこれで多くの時間を失った...
そしてbtw私はasync void
がベストプラクティスではないことを知っていますが、私はDelegateCommandを非同期にするソリューションを見つけることができませんでした。
EDIT
は、より多くの研究の後、私たちは、これは 'レンダリング' の問題であると結論づけました。 LongRunningCommandは非同期ですが、レンダリングとバインディングに時間がかかり、UIがブロックされます。私はこのレンダリングの問題を解決する方法を知らない。
_adjust viewmodel observablecollectionがcallResult_でUIの更新をいくつかしている場合にフリーズする – Fabio
observablecollectionに200個の結果を書き込むだけで、ウィンドウがブロックされます。私は窓を動かすことも傾けたり、1秒間リサイズしたりもしない。 – Ozkan
[この記事はMSDNから](https://msdn.microsoft.com/en-gb/magazine/dn630647.aspx)を見ましたか? – XAMlMAX