[英]Implement Timeout for function C#
我開發了一些定制的USB通信設備。 我已經使用此USB dll使事情變得更容易了:
很好的庫,但有一個小錯誤。 例如,如果我向USB設備發送了一些消息,但設備對此沒有響應(這是不正確的命令,等等),則該dll工具箱將等待命令響應到無窮大!
現在,我想添加一些超時,如果幾秒鍾后仍無響應,則進一步。
我現在使用bool狀態響應的方法,即知道讀取是否成功。
var readreport = _choosendevice.ReadReport();
稍后我需要“ readreport”變量,因為其中的(readreport.Data)是接受者數據。
我的問題是如何將此行實施為某些超時命令? 我已經找到了解決錯誤的方法,但不適用於我( 錯誤修復鏈接 )。
如有任何疑問,請詢問。 如果沒有以正確的方式質疑問題,對此表示抱歉,因為我是C#的初學者。 謝謝! 求助
您可以使用“任務”來執行以下操作:
Task<HideReport> myTask = Task.Factory.StartNew(() => _choosendevice.ReadReport(););
myTask.Wait(100); //Wait for 100 ms.
if (myTask.IsCompleted)
Console.WriteLine("myTask completed.");
else
Console.WriteLine("Timed out before myTask completed.");
HidReport report = myTask.Result;
編輯我不知道您的函數的返回值。 它返回一個HidReport對象。 我剛剛修改了任務創建以適合返回類型
正如評論中所說,庫已經提供了這種機制,因此您可以調用正確的方法
HidReport report = await ReadReportAsync(timeout);
** 編輯 **這段代碼對我來說很好
HidDevice device = HidDevices.Enumerate().ToList().First(e =>e.Description.Contains("mouse"));
Task<HidReport> t = Task.Factory.StartNew(() => device.ReadReport(1000));
t.Wait();
HidReport report = t.Result;
回復較晚,但以防萬一有人訪問此問題:
最好將單獨的任務用於結果和等待。
var waitTask = Task.Delay(timeoutInMs);
Task<MyReport> reportTask = Task.Factory.StartNew(() => _choosendevice.ReadReport(););
await Task.WhenAny(waitTask, reportTask );
if (reportTask.IsCompleted)
{
return await reportTask;
}
else
{
// preferred timeout error handling...
}
這樣,如果及時准備好報告,則不必等待超時。 (而且Taks.Delay比Task.Wait更好,因為它不會阻塞)
Task<HidReport> myTask = Task.Factory.StartNew(() => _choosendevice.ReadReport());
myTask.Wait(1000);
if (myTask.IsCompleted)
{
HidReport report = myTask.Result;
}
else
{
myTask.Dispose();
// show ERROR
}
也許這會工作。 到現在為止是工作,只是做一些測試,然后我確定(我幫這個頁面這個 :))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.