Использую библиотеку NTWAIN, написал класс, чтобы с ней работать, вот он:

public class ScanningTwain
    {
        private static readonly TWIdentity TwainAppId = TWIdentity.CreateFromAssembly(DataGroups.Image, Assembly.GetEntryAssembly());
        private List<System.Drawing.Image> lesImagesNum;
        EventWaitHandle session_SourceDisable_Wait;
        TwainSession session;
        DataSource myDS;
        public event EventHandler ScanDone;
        private EventArgs arg;
        private void OnScanDone() { if (ScanDone != null) { ScanDone(this, arg); } }

        public List<System.Drawing.Image> listImages
        { 
            get { return lesImagesNum; } 
        }


        public ScanningTwain()
        {
            lesImagesNum = new List<System.Drawing.Image>();
        }

        void session_SourceDisable(object sender, EventArgs e)
        {
            myDS.Close();
            session.Close();
        }

        void session_DataTransferred(object sender, NTwain.DataTransferredEventArgs e)
        {
            if (e.NativeData != IntPtr.Zero)
            {
                System.Drawing.Image img = null;

                var stream = e.GetNativeImageStream();
                if (stream != null)
                {
                    img = System.Drawing.Image.FromStream(stream);
                }

                if (img != null)
                {
                    lesImagesNum.Add(img);
                }
            }
            session_SourceDisable_Wait.Set();
            OnScanDone();
        }

        public void Scan(decimal dpi)
        {
            lesImagesNum.Clear();

            var appId = TWIdentity.CreateFromAssembly(DataGroups.Image, Assembly.GetExecutingAssembly());

            session = new TwainSession(appId);

            session.DataTransferred += session_DataTransferred;
            session.SourceDisabled += session_SourceDisable;

            session.Open();

            myDS = session.ShowSourceSelector();
            myDS.Open();

            PixelType typeCouleur = PixelType.Gray;

            if (myDS.Capabilities.ICapPixelType.CanSet &&
                myDS.Capabilities.ICapPixelType.GetValues().Contains(typeCouleur))
            {
                myDS.Capabilities.ICapPixelType.SetValue(typeCouleur);
            }

            TWFix32 DPI = (int)dpi;

            if (myDS.Capabilities.ICapXResolution.CanSet &&
                myDS.Capabilities.ICapXResolution.GetValues().Contains(DPI))
            {
                myDS.Capabilities.ICapXResolution.SetValue(DPI);
            }

            if (myDS.Capabilities.ICapYResolution.CanSet &&
                myDS.Capabilities.ICapYResolution.GetValues().Contains(DPI))
            {
                myDS.Capabilities.ICapYResolution.SetValue(DPI);
            }

            myDS.Enable(SourceEnableMode.ShowUI, false, System.IntPtr.Zero);

            session_SourceDisable_Wait = new EventWaitHandle(false, EventResetMode.AutoReset);
            session_SourceDisable_Wait.WaitOne();
        }
    }

Начинает не работать в момент когда происходит сканирование - происходит бесконечная загрузка (вечно крутящееся колесо загрузки) и все. Видимо неправильно отрабатывается завершение сканирования. Буду очень признателен, если подскажите в чем причина. Вот участок кода где я вызываю сканирование из этого класса:

private void bСканирование_Click(object sender, DoWorkEventArgs e)
        {
                scanningTwain = new ScanningTwain();
                scanningTwain.ScanDone += scanningTwain_ScanDone;
                scanningTwain.Scan(dpi);
        }

        private void scanningTwain_ScanDone(object sender, EventArgs e)
        {
            listImge = new List<Image>();
            listImge = scanningTwain.listImages;
          ...
        }

Ответы (0 шт):