我目前正在开发一个模块,用户可以在其中扫描文档并保存它们。当前,正在使用的工作代码来自GitHub的 Jeske (链接为here)。客户使用的扫描仪是: Epson Perfection V600 。前面提到的代码可以正常运行,可预期出现以下一种情况:如果扫描仪进入睡眠/非活动模式,并且用户在该状态下尝试扫描文档,则应用程序将在等待扫描仪响应时冻结自身(有时会,有时却不会)。确切地说,该程序在以下特定行冻结:
public class MessageAttribute {
private String key;
private String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
我的问题是:有没有一种方法,以防止结冰,而试图从给定的扫描仪扫描应用程序(当扫描器处于睡眠/不活跃模式这个问题只发生)
答案 0 :(得分:1)
您可以使用并发来防止阻塞。如果每当操作未结束时也将CancellationToken与CancellationTokenSource一起使用,则可以向函数发送cancel信号,这样扫描操作将被中止。
public Task Scan()
{
....
WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);
...
}
然后在您的主程序中
//wait 20 seconds before cancellation
CancellationTokenSource cts= new CancellationTokenSource(20000);
var myTask = Task.Run(() => Scan(), cts.Token);
await myTask;