为函数 C# 实现超时
Implement Timeout for function C#
我开发了一些定制设备的USB通信。我已经使用这个 USB dll 使事情变得更容易:
非常好的库,但有一个小错误。例如,如果我向 USB 设备发送一些内容,但设备没有对此做出响应(这不是正确的命令等),此 dll 工具箱正在等待命令响应到无穷大!
现在我想添加一些超时,如果几秒钟后没有响应。
我现在使用带有布尔状态响应的方法,我知道读取是否成功。
var readreport = _choosendevice.ReadReport();
稍后我需要"readreport"变量,因为里面(readreport.Data)是acceptet数据。
我的问题是如何将这一行实现到某个超时命令中?我已经找到了错误的解决方案,但对我不起作用 (bug fix link)。
如有任何问题请提问。如果问题没有以正确的方式提问,我很抱歉,因为我是 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 我不知道你函数的 return 值。它 return 是一个 HidReport 对象。我刚刚修改了任务创建以适应 return 类型
正如评论中所说,库已经提供了这种机制,因此您可以调用正确的方法
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;
Task<HidReport> myTask = Task.Factory.StartNew(() => _choosendevice.ReadReport());
myTask.Wait(1000);
if (myTask.IsCompleted)
{
HidReport report = myTask.Result;
}
else
{
myTask.Dispose();
// show ERROR
}
也许这会奏效。到目前为止一直在工作,只需进行一些测试然后我确认(我帮助了此页面 this:))
回复晚了,但万一有人访问这个问题:
结果和等待最好使用不同的任务。
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 好,因为它不会阻塞)
我开发了一些定制设备的USB通信。我已经使用这个 USB dll 使事情变得更容易:
非常好的库,但有一个小错误。例如,如果我向 USB 设备发送一些内容,但设备没有对此做出响应(这不是正确的命令等),此 dll 工具箱正在等待命令响应到无穷大!
现在我想添加一些超时,如果几秒钟后没有响应。
我现在使用带有布尔状态响应的方法,我知道读取是否成功。
var readreport = _choosendevice.ReadReport();
稍后我需要"readreport"变量,因为里面(readreport.Data)是acceptet数据。
我的问题是如何将这一行实现到某个超时命令中?我已经找到了错误的解决方案,但对我不起作用 (bug fix link)。
如有任何问题请提问。如果问题没有以正确的方式提问,我很抱歉,因为我是 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 我不知道你函数的 return 值。它 return 是一个 HidReport 对象。我刚刚修改了任务创建以适应 return 类型
正如评论中所说,库已经提供了这种机制,因此您可以调用正确的方法
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;
Task<HidReport> myTask = Task.Factory.StartNew(() => _choosendevice.ReadReport());
myTask.Wait(1000);
if (myTask.IsCompleted)
{
HidReport report = myTask.Result;
}
else
{
myTask.Dispose();
// show ERROR
}
也许这会奏效。到目前为止一直在工作,只需进行一些测试然后我确认(我帮助了此页面 this:))
回复晚了,但万一有人访问这个问题:
结果和等待最好使用不同的任务。
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 好,因为它不会阻塞)