C# 实现函数超时

esi*_*ned 0 c# timeout

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

隐藏库

非常好的库,但有一个小错误。例如,如果我向 USB 设备发送某些内容,而设备没有响应(这不是正确的命令等),则该 dll 工具箱等待命令响应到无穷大!

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

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

var readreport = _choosendevice.ReadReport();
Run Code Online (Sandbox Code Playgroud)

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

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

如有任何问题请询问。如果问题没有以正确的方式提出,抱歉,因为我是 C# 初学者。谢谢!求助

Par*_*228 5

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

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;
Run Code Online (Sandbox Code Playgroud)

编辑我不知道你的函数的返回值。它返回一个 HidReport 对象。我刚刚修改了任务创建以适应返回类型

正如评论中所述,库已经提供了这种机制,因此您可以调用正确的方法

HidReport report = await ReadReportAsync(timeout);
Run Code Online (Sandbox Code Playgroud)

**编辑** 这段代码对我来说很顺利

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;
Run Code Online (Sandbox Code Playgroud)