我想在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