当UI函数空闲时,Control.BeginInvoke不调用委托

时间:2013-01-24 23:10:58

标签: c# controls

我正在修改适用于某些外部硬件的Windows桌面应用程序。当用户从应用程序激活硬件时,启动进度(UI)表单。此表单创建一个线程,执行硬件的所有工作。当我尝试将进度报告回UI线程时,问题就出现了。似乎我的第一个Control.BeginInvoke(“谈判消息”)工作正常。但是,第二个(对进度条的第一次调整)似乎永远不会将其称为委托,因此应用程序会锁定后续的endinvoke。我认为问题是GUI现在处于空闲状态,但我不确定如何解决这个问题。任何帮助,将不胜感激。代码如下:

在UI加载方法主题中:

    private void frmTwainAquire_Load(object sender, EventArgs e)
    {
        try
        {
            //Show the GUI
            this.Visible = showGUI;
            pbScanningProgress.Value = 0;
            btnCancel.Enabled = false;
            btnCancel.Visible = false;

            // Set the delegates.
            SetScanMessageDelegate = new SetScanMessage(this.SetScanMessageMethod);
            SetRegistrationMessageDelegate = new SetRegistrationMessage(this.SetRegistrationMessageMethod);
            AddScanProgressDelegate = new AddScanProgress(this.AddScanProgressMethod);
            AddRecogProgressDelegate = new AddRecogProgress(this.AddRecogProgressMethod);

            // Set progress bars.
            pbScanningProgress.Value = 0;
            pbRecognition.Value = 0;
            abortScan = false;

            // Create thread here!
            twainInstance = new rScan.Twain();
            rScanning = new rScanThread(this, twainInstance);

            // Start the thread.
            rScanning.tScan = new Thread(rScanning.Scan);
            rScanning.tScan.Start();

        }
        catch (Exception ex)
        {
            // Error checking here.
        }
    }

代表方法:

public void SetScanMessageMethod(string scanMessage)
    {
        this.lblScanMessage.Text = scanMessage;
    }

    public void SetRegistrationMessageMethod(string recogMessage)
    {
        this.lblRecognition.Text = recogMessage;
    }

    public void AddScanProgressMethod(int progress)
    {
        this.pbScanningProgress.Value += progress;
    }

    public void AddRecogProgressMethod(int progress)
    {
        this.pbRecognition.Value += progress;
    }

提供问题的线程方法。请注意,该线程与前两个代码块位于不同的类中(两者都在UI类中): 公共类rScanThread:IMessageFilter

public void Scan()
    {
        // Set progress bar message.
        IAsyncResult result;
        if (frmTwainAquireInstance.lblScanMessage.IsHandleCreated && frmTwainAquireInstance.lblScanMessage.InvokeRequired)
        {
            result = frmTwainAquireInstance.lblScanMessage.BeginInvoke(frmTwainAquireInstance.SetScanMessageDelegate, "Negotiating Capabilities with Scanner.");
            frmTwainAquireInstance.lblScanMessage.EndInvoke(result);
        }
        else
        {
            frmTwainAquireInstance.lblScanMessage.Text = "Negotiating Capabilities with Scanner.";
        }

        // Start the intialization of the rScan process.
        bool intializeSuccess = twainInstance.Initialize(frmTwainAquireInstance.Handle);

        // If the process could not be started then quit.
        if (!intializeSuccess)
        {
            frmTwainAquireInstance.Close();
            return;
        }

        if (frmTwainAquireInstance.pbScanningProgress.IsHandleCreated && frmTwainAquireInstance.pbScanningProgress.InvokeRequired)
        {
            result = frmTwainAquireInstance.pbScanningProgress.BeginInvoke(frmTwainAquireInstance.AddScanProgressDelegate, 33);
            frmTwainAquireInstance.pbScanningProgress.EndInvoke(result);  // Lock up here.
        }
        else
        {
            frmTwainAquireInstance.pbScanningProgress.Value += 33;
        }

      // Do more work after.  The code never makes it this far.

    } // End of rScanThread.Scan()

0 个答案:

没有答案