Я пишу программу WPF, где я использую EventToCommand для обработки событий в сторонних элементах управления и подключаю их к ICommands. Мои методы модели просмотра - это все async и проблема, с которой я сталкиваюсь, что события не ждут завершения обработчиков. Проблема немного длинная, чтобы проиллюстрировать в WPF, но я обобщил ее в маленьком консольном приложении ниже.EventToCommand async?
Мой общий вопрос: существует ли реализация EventToCommand, которая позволит мне использовать обработчики async? Да, я сделал google, ничего не нашел. Документация mvvm-light here ничего не говорит об асинхронном режиме.
Я открыт для любых работ, которые выполняют свою работу. Обратите внимание, что в приведенном ниже коде я использую имя «ButtonClick», которое может заставить вас спросить, почему я не просто привязываюсь к команде .... это был плохой выбор именования для примера извините. В моем приложении WPF я обрабатываю события, для которых нет команды.
class Program
{
public event EventHandler ButtonClickEvent;
static void Main(string[] args)
{
Console.WriteLine("Program");
var p = new Program();
}
public Program()
{
ButtonClickEvent += ButtonClickEventHandler;
Console.WriteLine("Start fire event");
ButtonClickEvent(this, new EventArgs()); // In WPF app this event is handled by EventToCommand, which executes an ICommand
Console.WriteLine("End fire event");
Console.Write("Press any key...");
Console.ReadKey();
// Output
// Start fire event
// Start GetStringAsync
// End fire event <-- not waiting
// End GetStringAsync
}
// In WPF app this method is wired up to a DelegateCommand
public async void ButtonClickEventHandler(object sender, EventArgs e)
{
await DownloadStuffAsync();
}
public async Task DownloadStuffAsync()
{
Console.WriteLine("Start GetStringAsync");
string page = await new HttpClient().GetStringAsync("http://www.ibm.com");
Console.WriteLine("End GetStringAsync");
}
}
При выполнении в приложении пользовательского интерфейса [ваш код будет заблокирован] (http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html). –
Он не будет заторможен, но он замерзнет. Что также довольно странно, так это то, что пользователь хочет завершить процесс загрузки до того, как приложение станет пригодным для использования. – Sandesh
Нет, он будет тупик. Вы можете попробовать. Есть много сообщений, которые говорят об этом. Обратитесь к статье в мой комментарий выше для получения дополнительной информации. –