【问题标题】:Prevent scanner from freezing program防止扫描仪冻结程序
【发布时间】:2019-02-02 03:57:34
【问题描述】:

我目前正在开发一个模块,用户可以在其中扫描文档并保存它们。目前,正在使用的工作代码来自 Jeske,来自 GitHub(链接为 here)。客户使用的扫描仪是:Epson Perfection V600。前面提到的代码就像一个魅力,期待一种情况:如果扫描仪进入睡眠/非活动模式并且用户在该状态下尝试扫描文档,应用程序将在等待扫描仪响应时自行冻结(有时会,有时不会)。确切地说,程序在这一行冻结:

WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);

我的问题是:有没有办法防止应用程序在尝试从给定扫描仪进行扫描时冻结?(此问题仅在扫描仪处于睡眠/非活动模式时发生)

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以使用并发来防止阻塞。如果您还在操作未结束时将 CancellationToken 与 CancellationTokenSource 一起使用,则可以向您的函数发送取消信号,以便中止扫描操作。

    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;
    

    【讨论】:

    • ...只要wiaCommonDialog.ShowTransfer 可以从不同于 UI 线程的地方调用...我怀疑...你测试了吗?
    • 是的,我很确定 (wiaCommonDialog.ShowTransfer ) 必须在 UI 线程上。那可能行不通。冻结发生在其他人的代码中(在 UI 线程上运行)这一事实并没有使这看起来像是一件容易解决的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多