C#BackgroundWorker在完成之前完成了调用方式

本文关键字:调用 方式 C#BackgroundWorker | 更新日期: 2023-09-27 18:27:42

我一直在试图弄清楚为什么我的后台工作人员在还有很多事情要做的情况下"完成"了它的工作。实际上,我正在为这个应用程序重构代码,所以它过去确实有效,但现在我无法弄清楚出了什么问题。

具体来说,应用程序应该打开Outlook,然后执行一些检查。然而,后台工作程序在Outlook打开后立即退出,原因并不明显(正如您将在下面看到的那样,仍有大量处理工作要做)。

这似乎发生在Start()方法的早期,直接在Outlook.exe上调用Process.Start()之后。

代码按以下顺序运行:

calling the background worker - this was the user's choice from a radio set

....
        else if (radioButton5.Checked == true)
        {
            textBox1.Text = "Please wait while your session restarts";
            pageControl1.SelectedIndex = 10;
            backgroundReset.RunWorkerAsync();
        }

The do-work method

    public void backgroundReset_DoWork(object sender, DoWorkEventArgs e)
    {
        backgroundReset.WorkerSupportsCancellation = true;
        Session.Reset();
    }

the reset session method starts by killing the current session ...

    public static void Reset()
    {
        KillSession();
        System.Threading.Thread.Sleep(5000);
        Start();
        // THE BACKGROUNDWORKER EXITS BEFORE HERE!
        if (IsLoggedIn() == false)
        {
            return;
        }
        else
        {
            // Make sure Lync is open before finishing the process ...
            var j = 0;
            GetSession(Init.servers);
            j = 0;
            var checker = false;
            checker = ProcessHandler.CheckRunning("lync.exe");
            while (checker == false)
            {
                if (j == 100)
                {
                    break;
                }
                Thread.Sleep(500);
                checker = ProcessHandler.CheckRunning("lync.exe");
                j++;
            }
        }
    }

正如您从注释中看到的,在Reset()方法执行完毕之前,backgroundworder正在调用RunWorkerCompleted。

以下是其他被称为(kill,logoff,start)的方法:

KillSession logs the session of and then makes sure it is logged off

    private static void KillSession()
    {
        if (sessionId != null)
        {
            LogOff();
            for (int i = 0; i < 150; i++)
            {
                if (IsLoggedIn() == true)
                {
                    Thread.Sleep(500);
                }
                else
                {
                    break;
                }
            }
        }
    }

LogOff sends a Cmd command to log off the current session

    public static void LogOff()
    {
        string strCmdIn = "/C LOGOFF " + sessionId + " /SERVER:" + serverName;
        Cmd.Exec(strCmdIn);
    }

Start() Simply opens Outlook, causing a Citrix session to also start. The app is definitely launching Outlook, but after that it doesn't reach either of the for statements - the BackgroundWorker just exits.

    public static void Start()
    {
        Process.Start(appDataCitrix + "Outlook.exe");
        for (int i = 0; i < 15; i++)
        {
            if (IsLoggedIn2() == false)
            {
                Thread.Sleep(1000);
            }
            else
            {
                break;
            }
        }
        if (IsLoggedIn2() == false)
        {
            Process.Start(appDataCitrix + "Outlook.exe");
            for (int i = 0; i < 10; i++)
            {
                if (IsLoggedIn2() == false)
                {
                    Thread.Sleep(1000);
                }
                else
                {
                    break;
                }
            }
        }
    }

有人知道这里发生了什么吗?它把我逼疯了!

非常感谢

更新

The RunWorkerCompleted Method:As far as my understanding goes, this has no baring on when the process will finish.

    public void backgroundReset_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (Session.IsLoggedIn())
        {
            btnFailFinish.Visible = true;
            label10.Text = Session.serverName;
            pageControl1.SelectedIndex = 3;
        }
        else
        {
            pageControl1.SelectedIndex = 10;
            pictureBox2.Visible = false;
            textBox1.Text = "Double-click Outlook on your desktop to launch a new session.";
            textBox15.Text = "Once you have done this please click Finish.";
            pictureBox9.Visible = true;
        }
    }

C#BackgroundWorker在完成之前完成了调用方式

这可能是因为从start方法中抛出了异常。

您可以在该方法周围添加一个try/catch块,并从catch中处理错误,或者在发生异常时签入RunWorkerCompleted方法:

    private void RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            // handle your exception here
        }
    }