Я провел целый день в поисках и пытается образцы кода, чтобы, наконец, то, что работает (то есть асинхронные операции с использованием Caliburn Сопрограммы, которые не блокируют пользовательский интерфейс), поэтому я позволю себе поделиться ,
Насколько я понимаю, Coroutines в Caliburn не обрабатывает потоки, они просто обеспечивают элегантный способ выполнения асинхронного выполнения и управления кодом, обрабатываемым одним способом. Для обработки операций в фоновом потоке нужно использовать другие инструменты, такие как BackgroundWorkers.
Я нашел this link довольно интересно, для silverlight. Цель состояла в том, чтобы включить фонового работника в класс, который обертывает вызовы coroutine.
Как я хотел в WPF с небольшими различиями, я закончил с этим пример кода, который работает на моей машине:
Обертывание класса:
using System;
using Caliburn.Micro;
using System.ComponentModel;
namespace MyApp.Implementation
{
public class BackgroundCoRoutine : IResult
{
private readonly System.Action action;
public BackgroundCoRoutine(System.Action action)
{
this.action = action;
}
public void Execute(ActionExecutionContext context)
{
using (var backgroundWorker = new BackgroundWorker())
{
backgroundWorker.DoWork += (e, sender) => action();
backgroundWorker.RunWorkerCompleted += (e, sender) => Completed(this, new ResultCompletionEventArgs());
backgroundWorker.RunWorkerAsync();
}
}
public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
}
}
И в одном из моих ViewModels, следующее :
public IEnumerable<IResult> ProcessTask()
{
IsBusy = true;
TempObject result = null;
for (int i = 1; i < 4; i++) // Simulates a loop that processes multiple items, files, fields...
{
yield return new BackgroundCoRoutine(() =>
{
System.Threading.Thread.Sleep(1000); // Time consuming task in another thread
result = new TempObject("Item " + i);
});
MyObservableCollection.Add(result); // Update the UI with the result, in the GUI thread
}
IsBusy = false;
}
при этом, когда я нажимаю на кнопку ProcessTask, интерфейс не замерзает, а вычисленные результаты появляются, как только они становятся доступными на фоне Wo rker процесс. Состояние IsBusy не является обязательным, но показывает, как состояния, связанные с пользовательским интерфейсом, могут перейти в асинхронный код.
Надеюсь, это поможет другому мне!
Является ли это предпочтительным каким-либо образом для ключевых слов 'async' и' await' в C# 5.0? –
@RobertHarvey Я думаю, что нет никакой разницы в том, что использовать. В документации и дискуссионном форуме говорится, что сопрограммы обеспечивают ту же функциональность, что и 'async' и' await'. Но я хочу знать, правильно ли я понимаю документацию или нет? – Alex