【发布时间】:2011-01-16 12:00:34
【问题描述】:
有没有人尝试使用TwainDotNet 使用来自 .NET 的 TWAIN API 调用进行扫描?虽然它通常运行良好,但在与使用 MVVM 的 WPF 应用程序一起使用时,我会遇到一些问题。基本上我是从一个 Service 调用 Twain 扫描函数,而 Service 又使用一个 BackgroundWorker。
List<BitmapSource> bitmapSources = new List<BitmapSource>();
Twain twain = new Twain(new WpfWindowMessageHook(_window));
ScanSettings settings = new ScanSettings() { ShowTwainUI = false };
using (BackgroundWorker worker = new BackgroundWorker())
{
worker.DoWork += (sndr, evnt) =>
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
EventHandler scanCompleteHandler = (se, ev) => { waitHandle.Set(); };
twain.ScanningComplete += scanCompleteHandler;
twain.StartScanning(settings);
waitHandle.WaitOne();
if (twain.Images.Count > 0)
{
foreach (var image in twain.Images)
{
BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(new Bitmap(image).GetHbitmap(),
IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
bitmapSources.Add(bitmapSource);
}
}
};
worker.RunWorkerCompleted += (sndr, evnt) => { image1.Source = bitmapSources[0]; };
worker.RunWorkerAsync();
}
当我们使用 BackgroundWorker 时,永远不会触发 ScanningComplete 事件处理程序。有解决此问题的建议吗?
【问题讨论】:
-
Raj,我从 google TwainDotNet 问题页面下载了您的示例项目。我想对 backgroundworker 做同样的事情,因为我想在扫描时在窗口上显示进度/状态。我在访问图像时遇到了同样的问题。但是,在后台工作人员中扫描时,我也无法让窗口做出响应。当您使用此解决方案进行扫描时,您是否能够让窗口更新/响应?请告诉我。
-
戴夫,示例解决方案应该这样做对吗?
-
不。我想在窗口上放一个进度条并显示一些反馈。 DoWork 正在处理扫描。所以,我需要另一个线程来报告进度。我启动了一个 DispatcherTimer 并调用: Dispatcher.Invoke(updatePbDelegate, System.Windows.Threading.DispatcherPriority.Background, new object[] { ProgressBar.ValueProperty, progressBarValue });但是在扫描完成之前,更新进度条的事件不会触发。如果您有其他想法,请告诉我。
标签: c# .net backgroundworker twain