为函数C#实现超时

时间:2015-08-11 14:18:45

标签: c# timeout

我开发了一些定制设备的USB通信。我已经使用这个USB dll来简化操作:

HidLibrary

非常好的库,但有一个小bug。例如,如果我向USB设备发送内容并且设备没有响应(这不是正确的命令等),这个dll工具箱等待无限的命令响应!

现在我想添加一些超时,如果在一段时间之后没有进一步的响应。

我现在使用方法whith bool状态响应,我知道读取是否成功。

var readreport = _choosendevice.ReadReport();

后来我需要“readreport”变量,因为里面(readreport.Data)是接受数据。

我的问题是如何将此行实现为某些超时命令?我找到了bug的解决方案,但不适合我(bug fix link)。

如有任何问题请询问。如果问题没有以正确的方式提出质疑,对不起,因为我是C#的初学者。 感谢!寻求帮助

3 个答案:

答案 0 :(得分:3)

您可以使用“任务”执行此操作:

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;

答案 1 :(得分:0)

Task<HidReport> myTask = Task.Factory.StartNew(() => _choosendevice.ReadReport());
myTask.Wait(1000);

if (myTask.IsCompleted)
{
     HidReport report = myTask.Result;
}
else
{
     myTask.Dispose();
     // show ERROR
}

也许这会奏效。到现在为止,只做几个测试然后我确认(我帮助了这个页面this :))

答案 2 :(得分:0)

最新答复,但如果有人访问此问题:

最好将单独的任务用于结果和等待。

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更好,因为它不会阻塞)