繁体   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