使用TWAIN异步扫描文档

问题描述:

我有一个C#程序,它使用TwainDotNet扫描并接收来自fujitsu扫描仪的图像。我有工作代码,但我想要异步执行扫描和图像传输,因为GUI会挂起直到扫描过程完成。使用TWAIN异步扫描文档

我尝试使用此代码遵循this post's接受的解决方案的指导方针:

public void StartScanning() 
{ 
    // Run the scanner from a separate thread 
    Task.Run(() => ScanThread()); 
} 

private void ScanThread() 
{ 
    // Instantiate the Twain object and hookup event handlers 
    Twain twain = new Twain(new WinFormsWindowMessageHook(new Form())); 
    twain.TransferImage += Twain_TransferImage; 
    twain.ScanningComplete += Twain_ScanningComplete; 

    // Start the scanning process by passing along pre-defined scan settings 
    twain.StartScanning(GetScanSettings()); 
} 

ScanThread()的代码在技术上是正确的,因为它的工作原理通话以外的Task.Run()(这意味着它运行在GUI罚款线)。但是,如果从新线程调用ScanThread()不起作用。扫描仪硬件从不开始扫描图像,更不用说传输它们了。

有谁知道使用TWAIN异步扫描和传输图像的具体方法吗?

我怀疑“简单”的答案是“你不能”。

更复杂的答案是“twain”(或者可能是“GetScanSettings” - 这是干什么的?)可能需要在UI线程上执行操作。

参见:TwainDotNet Scanning using TWAIN with BackgroundWorker

然而,这是可能的,利用你已经得到了代码,但您可能创建窗体几乎立即如果引用是弱(如事件委托)超出范围。

尝试添加线程安全列表或字典,在创建它时添加表单并在Twain_ScanningComplete中将其删除。

嗯。 其实,试试

private ConcurrentDictionary<Twain,Form> m_References = new ConcurrentDictionary<Twain,Form>(); 


private void ScanThread() 
{ 
    // Instantiate the Twain object and hookup event handlers 
    Form frm = new Form(); 
    Twain twain = new Twain(new WinFormsWindowMessageHook(frm)); 
    m_References.Add(twain, frm); 

    twain.TransferImage += Twain_TransferImage; 
    twain.ScanningComplete += Twain_ScanningComplete; 

    // Start the scanning process by passing along pre-defined scan settings 
    twain.StartScanning(GetScanSettings()); 
} 


private void Twain_ScanningComplete(object sender, ScanningCompleteEventArgs args) 
{ 
    Form frm; 
    m_References.TryRemove((Twain) sender, out frm); 
    if(null != frm) 
    { 
     frm.Close(); 
    } 
} 
+0

谢谢你的详细建议。我试过这个,但结果是一样的 - 扫描仪硬件永远不会启动。我读过旧帖子,说异步图像传输_is_和_isn't_不可能,我想我会在2017年试一试。 – Richard

+0

只是为了澄清:'GetScanSettings()'是一种方便的方法来返回一个'ScanSettings'对象特定于TwainDotNet。该对象是一个可以或不可以被特定扫描器使用的字段的容器。 – Richard

+0

您可以序列化“GetScanSettings”的结果并进行比较,只是为了查看结果是否有所不同? –