Я прочитал: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html и принятый ответ в взаимоблокировке даже после использования ConfigureAwait (false) в потоке Asp.Net , но я слишком плотный, чтобы видеть, что происходит.
У меня есть код:
private void CancelCalibration()
{
// ...
TaskResult closeDoorResult = CloseLoadDoor().ConfigureAwait(false).GetAwaiter().GetResult();
CalibrationState = CalibrationState.Idle;
return;
// ...
}
private async Task<TaskResult> CloseLoadDoor()
{
TaskResult result = await _model.CloseLoadDoor().ConfigureAwait(false);
return result;
}
public async Task<TaskResult> CloseLoadDoor()
{
TaskResult result = new TaskResult()
{
Explanation = "",
Success = true
};
await _robotController.CloseLoadDoors().ConfigureAwait(false);
return result;
}
public async Task CloseLoadDoors()
{
await Task.Run(() => _robot.CloseLoadDoors());
}
public void CloseLoadDoors()
{
// syncronous code from here down
_doorController.CloseLoadDoors(_operationsManager.GetLoadDoorCalibration());
}
Как видите, CloseLoadDoor объявлен асинхронным.Я подумал (особенно из первой статьи выше), что если я использую ConfigureAwait (false), я могу вызвать асинхронный метод без тупика.Но это то, что я, кажется, получаю.Вызов «CloseLoadDoor (). ConfigureAwait (false) .GetAwaiter (). GetResult () никогда не возвращается!
Я использую GetAwaiter.GetResult, потому что CancelCalibration НЕ является асинхронным методом. Это определенный обработчик кнопкичерез шаблон MVVM:
public ICommand CancelCalibrationCommand
=> _cancelCalibrationCommand ?? (_cancelCalibrationCommand = new DelegateCommand(CancelCalibration));
Если кто-то скажет мне, что я могу сделать асинхронную отмену калибровки, пожалуйста, скажите мне, как. Могу ли я просто добавить async
в объявление метода? ОДНАКО я быЯ все еще хотел бы знать, почему шаблон ConfigureAwait.GetAwaiter.GetResult
доставляет мне неприятности. Насколько я понимаю, GetAwaiter.GetResult
был способом вызова асинхронного метода из синхронных методов, когда изменение сигнатуры не вариант.
Япредполагаю, что я на самом деле не освобождаюсь от использования оригинального контекста, но что я делаю не так и каков порядок, чтобы это исправить? Спасибо, Дейв