Вы должны правильно использовать асинхронный метод, используя await
вместо Task.Result
. Task.Result
вызовет асинхронный метод c синхронно в потоке пользовательского интерфейса, который заблокирует пользовательский интерфейс, поскольку у него нет свободных ресурсов для обновления макета.
public async Task DoStuff()
{
View.LogFenster logFenster = new View.LogFenster(logViewModel);
logFenster.Show();
Action<string> loaderStatusAction = s => logViewModel.LogText += s + "\n";
List<item> items = await LoaderTask(loaderStatusAction);
}
Если DoStuff
является обработчиком событий тогда подпись должна измениться на:
public async void DoStuff()
Шаблон отчета о беззаботном прогрессе рекомендует использовать IProgress<T>
:
public async Task DoStuff()
{
View.LogFenster logFenster = new View.LogFenster(logViewModel);
logFenster.Show();
var progressReporter = new Progress<string>(s => logViewModel.LogText += s + "\n");
List<item> items = await LoaderTask(progressReporter);
}
async Task LoaderTask(IProgress<string> progressReporter)
{
await Task.Run(
() =>
{
for (int i = 5; i < 90; i++)
{
progressReporter.Report($"{DateTime.Now.ToString("HH:mm:ss")}: i loop");
}
});
}