我已经阅读了这篇文章:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html和deadlock even after using ConfigureAwait(false) in Asp.Net flow的被接受的答案,但是我太愚钝了,看不出发生了什么。
我有一段代码:
您好,这段文字的意思是:正如您所看到的,CloseLoadDoor 声明为异步方法。我认为(尤其是从上面第一篇文章中),如果我使用 ConfigureAwait(false),我可以调用一个异步方法而不会出现死锁。但事实似乎并非如此。调用 "CloseLoadDoor().ConfigureAwait(false).GetAwaiter().GetResult()" 没有返回!我正在使用 GetAwaiter.GetResult,因为 CancelCalibration 不是一个异步方法。它是通过 MVVM 模式定义的按钮处理程序。
如果有人告诉我可以将CancelCalibration设置为异步方法,请告诉我如何操作。我只需要在方法声明中添加
我有一段代码:
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));
如果有人告诉我可以将CancelCalibration设置为异步方法,请告诉我如何操作。我只需要在方法声明中添加
async
吗?然而,我仍然想知道为什么ConfigureAwait.GetAwaiter.GetResult
模式会给我带来麻烦。我的理解是,GetAwaiter.GetResult
是一种在不改变签名的情况下从同步方法调用异步方法的方法。 我猜我并没有真正地摆脱使用原始上下文,但我做错了什么,以及修复它的模式是什么?
谢谢,
戴夫
Task.Delay()
模拟_model.CloseLoadDoor()
)时没有遇到死锁问题。 - GSergCancelCalibration
用作委托来命令它是一个逻辑事件处理程序,并且可以标记为async void
,这将允许您await CloseDoor()
。 - JSteward