我有一个使用TwainDotNet从富士通扫描仪扫描和接收图像的C#程序。我有工作代码,但我想异步执行扫描和图像传输,因为GUI会挂起,直到扫描过程完成。
我尝试使用以下代码遵循this post's accepted中的指导原则:
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异步扫描和传输图像的具体方法?
发布于 2017-07-07 05:32:00
我怀疑“简单”的答案是“你不能”。
更复杂的答案是"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();
}
}https://stackoverflow.com/questions/44958906
复制相似问题