簡體   English   中英

使用TWAIN異步掃描文檔

[英]Scanning documents asynchronously using TWAIN

我有一個使用TwainDotNet掃描和接收來自富士通掃描儀的圖像的C#程序。 我有可用的代碼,但是我想異步執行掃描和圖像傳輸,因為GUI會掛起,直到掃描過程完成。

我嘗試使用以下代碼,遵循本帖子接受的解決方案中的准則:

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()的代碼在ScanThread()是正確的,因為它可以在對Task.Run()的調用之外工作(這意味着它可以在GUI線程上正常運行)。 但是,如果從新線程調用, ScanThread()不起作用。 掃描儀硬件永遠不會開始掃描圖像,更不用說傳輸圖像了。

有誰知道使用TWAIN異步掃描和傳輸圖像的具體方法嗎?

我懷疑“簡單”的答案是“你不能”。

涉及更多的答案是“吐溫”(或者可能是“ GetScanSettings”-這是做什么的?)可能需要在UI線程上執行操作。

請參閱: 使用TWAIN和BackgroundWorker進行TwainDotNet掃描

但是,有可能使用所獲得的代碼,但是如果引用較弱(例如事件委托),則創建的表單可能幾乎立即超出范圍。

嘗試添加線程安全列表或字典,在創建表單時將其添加到表單中,然后在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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM