使用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();
}
}
谢谢你的详细建议。我试过这个,但结果是一样的 - 扫描仪硬件永远不会启动。我读过旧帖子,说异步图像传输_is_和_isn't_不可能,我想我会在2017年试一试。 – Richard
只是为了澄清:'GetScanSettings()'是一种方便的方法来返回一个'ScanSettings'对象特定于TwainDotNet。该对象是一个可以或不可以被特定扫描器使用的字段的容器。 – Richard
您可以序列化“GetScanSettings”的结果并进行比较,只是为了查看结果是否有所不同? –