我在下面有这个button5功能。我想要的是,当用户希望在单击button5之后单击button1时,应该中断button5中的while循环,因为现在的选择为1。Choice是在开始时设置为零的全局变量。在运行button5函数时,单击时不会调用button1函数。如何解决这个问题呢?

   This is the Answer Thanks Everyone For the Help!!

         private Thread demoThread = null;
                delegate void SetTextCallback(string text);

     private void button1_Click(object sender, EventArgs e)
            {
                    choice = 1;

                System.Console.WriteLine(choice);
            }
         private void button5_Click(object sender, EventArgs e)
                    {
                        //button1.Enabled = false;
                        button5.Visible = false;
                        panel2.Visible = true;
                        panel1.Visible = true;
                        panel3.Visible = true;
                        label2.Visible = true;
                        button1.Visible = true;
                        button2.Visible = true;
                        button3.Visible = true;
                        button4.Visible = true;

                        this.demoThread = new Thread(new ThreadStart(this.StartForLoop));

                        this.demoThread.Start();



                    }
                    private void StartForLoop()
                    {
                        while (choice != 1 || choice != 2 || choice != 3)
                        {


                           if (choice == 1 )
                            {
                                choice = 1;
                                break;
                            }

                           if (choice == 2)
                           {
                               choice = 2;
                               break;
                           }

                           if (choice == 3)
                           {
                               choice = 3;
                               break;
                           }
                            Application.DoEvents();

                        }
                        System.Console.WriteLine("AAA");
                        if (choice == 3)//why
                        {
                        }
                        if (choice == 1)//true
                        {
                            System.Console.WriteLine("label");

                            this.SetText("Does the animal lay eggs?");
                        }
                        if (choice == 2)//false
                        {
                        }

                    }

最佳答案

您在使用Thread时遇到了问题,问题是您在button 5的循环中编写线程正处于繁忙状态,直到它完成对button5的代码处理为止,您的线程将不再关注任何其他事情。

为了解决这个问题,您必须像这样在新线程内部运行while循环:

Thread t = new Thread (new ThreadStart(delegate(){
    //while goes here along with the if's...
}));
t.Start();


在您的button1中,当您更改全局变量的值时
现在将知道在button5中启动的线程内的代码
您所做的更改并相应地表现。

此外,请注意以下几点,因为选择是全局变量
现在可以同时由两个线程访问该程序线程
和新线程,因此,请确保您访问选择变量
使用互斥锁,在C#中,您可以访问线程共享变量,如下所示:

//declare this next to your choice variable.
Object mux_choice = new Object();

lock(mux_choice){
   //changing choice here is thread safe.
}


由于选择似乎是一种值类型,因此您必须创建一个对象,该对象表示对值类型变量(http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx)的访问。

您可以在此处获取有关C#中线程的更多信息:
http://www.albahari.com/threading/

注意:确保在使用选择变量的所有地方保护它。

另外,根据您的评论,我假设您想修改表单控件
属性,例如label2.Text =“ ...”,如果这样做,您将面临“跨线程异常”。若要修改Controls属性,必须调用Invoke方法,该方法调用UI线程中的更改,如下所示:

label2.Invoke((MethodInvoker)(() => label2.Text = "some text"));


根据.NET Framework版本,以下是与.NET 2.0兼容的代码:

label2.Invoke(new MethodInvoker(delegate(){ label2.Text = "some text"; }));


问候。

关于c# - Windows窗体中的Button_click,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20872210/

10-12 05:31