我想在C#中使用异步/等待功能编写硬件库。对于许多操作,将会有两种方法,一种是异步运行的,另一种是同步运行异步方法。例如,考虑一下:在C中同步返回值异步方法的问题#
public override bool ReferenceRun(bool positiveDirection) {
var runTask = ReferenceRunAsync(positiveDirection);
return runTask.Result;
}
public override async Task<bool> ReferenceRunAsync(bool positiveDirection) {
String cmd = createAxisCommand(positiveDirection ? refRunPlusCmd : refRunMinusCmd);
bool writeOK = writeToCOMPort(cmd);
if (!writeOK) return false;
return await Task.Factory.StartNew(() => {
WaitForHalt();
return setParameter(postitionParam, 0);
});
}
形式this和that答案,我怀疑这是确定调用runTask.Result
以等待异步方法来完成,然后检索结果。但是,当我运行代码时,对ReferenceRun
的调用永远不会返回。当我在调试器中暂停执行时,我可以看到它挂在return runTask.Result
声明处。
这是怎么回事?
编辑: 根据this,所要求的行为,就可以实现这样的:
public override bool ReferenceRun(bool positiveDirection) {
var runTask = Task<bool>.Run(async() => { return await ReferenceRunAsync(positiveDirection); });
return runTask.Result;
}
我确实尝试过;它没有工作。托马斯·列维斯克的回答澄清了原因。 – Matz
的确,但我认为应该添加runTask.Wait来验证结果是否设置为在ReferenceRun中返回。抱歉答案应该是额外的。 –
其实是的,但afaik'Task.Result'已经在等待任务完成了。 – Matz