我在下面有这个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/