实现函数C#的超时



我开发了一些定制设备的USB通信。我用这个USB dll让事情变得更容易:

HidLibrary

非常好的库,但有一个小错误。例如,如果我把一些东西发送到USB设备,而设备对此没有响应(这不是正确的命令,等等(,这个dll工具箱正在等待命令响应无穷大

现在,如果几秒钟后没有响应,我想添加一些超时。

我现在使用布尔状态响应的方法,我知道阅读是否成功。

var readreport = _choosendevice.ReadReport();

稍后我需要"readreport"变量,因为(readreport.Data(里面有acceptet数据。

我的问题是如何将这一行实现为一些超时命令?我已经找到了bug的解决方案,但对我不起作用(bug修复链接(。

如果有任何问题,请提问。若问题并没有以正确的方式提出,那个么很抱歉,因为我是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;

EDIT我不知道函数的返回值。它返回一个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好。等待,因为它不会阻塞(

Task<HidReport> myTask = Task.Factory.StartNew(() => _choosendevice.ReadReport());
myTask.Wait(1000);
if (myTask.IsCompleted)
{
     HidReport report = myTask.Result;
}
else
{
     myTask.Dispose();
     // show ERROR
}

也许这会奏效。到目前为止,只做了一些测试,然后我确认(我帮助这个页面:(

相关内容

  • 没有找到相关文章

最新更新