【问题标题】:C# Background worker not completingC# 后台工作人员未完成
【发布时间】:2018-09-16 19:13:20
【问题描述】:

我的后台工作人员在运行一次后未完成并随后挂起。后台工作人员处理运行线性阶段的程序,因此正确的时机很重要(因此所有Thread.Sleep() 调用。)

这是我的代码:

public MainForm()
        {
            InitializeComponent();
            bgW2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgW2_RunWorkerCompleted);
        }
private void bgW2_DoWork(object sender, DoWorkEventArgs e)
        {
            string program = @"C:\Users\mikegjohn\source\repos\CLL AutoForce\Test.csv";
            var stream = new FileStream(program, FileMode.Open, FileAccess.Read);
            using (var streamReader = new StreamReader(stream))
            {
                string ln;
                while ((ln = streamReader.ReadLine()) != null)
                {
                    string[] lnArr = ln.Split(',');

                    switch (lnArr[1])
                    {
                        case "0":

                            sendCommand("L-");
                            string status = "";
                            while (status != "0")
                            {
                                Thread.Sleep(250);
                                status = loopCommands("PS");
                            }
                            Thread.Sleep(1000);
                            break;

                        case "1":
                            string p = Fn.convertPos(lnArr[3]);
                            sendCommand("X"+p);
                            string s = Convert.ToString(Fn.backconvert(loopCommands("PX")));

                            while (s != lnArr[3])
                            {
                                Thread.Sleep(250);
                                s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
                            }
                            Thread.Sleep(1000);
                            break;
                        case "2":
                            Fn.MeasureLabel();
                            break;
                        case "3":
                            sendCommand("HSPD=500000");
                            Thread.Sleep(500);
                            sendCommand("LSPD=250000");
                            Thread.Sleep(500);
                            sendCommand("X0");
                            string x = Convert.ToString(Fn.backconvert(loopCommands("PX")));

                            while (x != lnArr[4])
                            {
                                Thread.Sleep(250);
                                s = Convert.ToString(Fn.backconvert(loopCommands("PX")));
                            }
                            Thread.Sleep(1000);
                            sendCommand("HSPD=250000");
                            sendCommand("LSPD=50000");
                            break;
                    }

                }
            }

        }


private void btnRun_Click(object sender, EventArgs e)
    {

        bgW2.RunWorkerAsync();
    }

    private void bgW2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        MessageBox.Show("Program completed");
    }

Messagebox.Show 永远不会触发。我已经查看了其他一些类似的问题,这些问题主要指向 UI 线程的阻塞。谁能指出我正确的方向?

【问题讨论】:

    标签: c# asynchronous backgroundworker


    【解决方案1】:

    您可能错过了 DoWork 活动。

    public Form1() { 
        InitializeComponent(); 
        bgW2.DoWork += new DoWorkEventHandler(bgW2_DoWork) ;
        bgW2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgW2_RunWorkerCompleted);
    }
    

    https://stackoverflow.com/a/14734610

    【讨论】:

    • 感谢您的回复 - 我已将其弹出,但恐怕没有任何改变。
    【解决方案2】:

    发现了我的问题 - 这是case "3" 中的一个错误,我没有发现

    case "3":
                                sendCommand("HSPD=500000");
                                Thread.Sleep(500);
                                sendCommand("LSPD=250000");
                                Thread.Sleep(500);
                                sendCommand("X0");
                                string x = Convert.ToString(Fn.backconvert(loopCommands("PX")));
    
                                while (x != lnArr[4])
                                {
                                    Thread.Sleep(250);
                                    s = Convert.ToString(Fn.backconvert(loopCommands("PX"))); // <-- this does not match the while so it was getting stuck in the loop 
                                }
                                Thread.Sleep(1000);
                                sendCommand("HSPD=250000");
                                sendCommand("LSPD=50000");
                                break;
    

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      相关资源
      最近更新 更多