防止扫描仪冻结程序

时间:2019-02-01 19:41:19

标签: c#

我目前正在开发一个模块,用户可以在其中扫描文档并保存它们。当前,正在使用的工作代码来自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;
    }
}

我的问题是:有没有一种方法,以防止结冰,而试图从给定的扫描仪扫描应用程序(当扫描器处于睡眠/不活跃模式这个问题只发生)

1 个答案:

答案 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;