[英]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.