簡體   English   中英

為函數C#實現超時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM