C# 为什么线程IsAlive即使在线程内执行最后一个命令后也返回false
我在标签单击事件中启动了一个线程。线程完成了它的任务。我甚至得到了线程中的最后一个消息框。我想在完成线程后在label click事件中执行更多指令。因此,我使用了一个带有线程的C# 为什么线程IsAlive即使在线程内执行最后一个命令后也返回false,c#,multithreading,C#,Multithreading,我在标签单击事件中启动了一个线程。线程完成了它的任务。我甚至得到了线程中的最后一个消息框。我想在完成线程后在label click事件中执行更多指令。因此,我使用了一个带有线程的IsAlive属性的if语句。看起来线程的IsAlive属性值总是true。怎么用?如何确保所有线程在我关闭应用程序时结束,还是在我关闭应用程序时自然结束 private void lbl\u Calc\u单击(对象发送方,事件参数e) { 标签=(标签)发送者; //执行计算的新线程 螺纹t=新螺纹(()=>Threa
IsAlive
属性的if
语句。看起来线程的IsAlive
属性值总是true
。怎么用?如何确保所有线程在我关闭应用程序时结束,还是在我关闭应用程序时自然结束
private void lbl\u Calc\u单击(对象发送方,事件参数e)
{
标签=(标签)发送者;
//执行计算的新线程
螺纹t=新螺纹(()=>ThreadedMethodForCalc(标签));
t、 Start();
//检查IsAlive属性
//但是不起作用
如果(t.IsAlive==false)
{
MessageBox.Show(“请输入数据”);
//这里有更多说明
}
}
专用void ThreadedMethodForCalc(标签)
{
//计算。未显示
MessageBox.Show(“线程结束”);//已执行
返回;
}
如果必须使用线程,可以使用等待线程完成
private void lbl_Calc_Click(object sender, EventArgs e)
{
Label label = (Label)sender;
//new thread to do the calc
Thread t = new Thread(() => ThreadedMethodForCalc(label));
t.Start();
t.Join(); //wait until the thread completes
MessageBox.Show("please enter the data");
//more instruction here
}
但是,这也会在线程运行时锁定UI,这意味着这与直接调用ThreadedMethodForCalc
没有太大区别
为了避免这种情况,您可以使用async
/wait
和:
这将使UI在运行ThreadedMethodForCalc
时对用户输入做出响应。但是,您可能必须禁用表单上的某些控件,以确保用户不能在该操作运行时执行不应执行的操作,然后再次启用这些控件。但这是你必须做出的决定
这里有关于异步编程的更多信息:如果必须使用线程
,可以使用等待线程完成
private void lbl_Calc_Click(object sender, EventArgs e)
{
Label label = (Label)sender;
//new thread to do the calc
Thread t = new Thread(() => ThreadedMethodForCalc(label));
t.Start();
t.Join(); //wait until the thread completes
MessageBox.Show("please enter the data");
//more instruction here
}
但是,这也会在线程运行时锁定UI,这意味着这与直接调用ThreadedMethodForCalc
没有太大区别
为了避免这种情况,您可以使用async
/wait
和:
这将使UI在运行ThreadedMethodForCalc
时对用户输入做出响应。但是,您可能必须禁用表单上的某些控件,以确保用户不能在该操作运行时执行不应执行的操作,然后再次启用这些控件。但这是你必须做出的决定
这里有关于异步编程的更多信息:您意识到您的检查是在启动线程后立即执行的,而不是在线程完成时执行的?@GSerg,但我没有得到´´´´MessageBox.Show(“请输入数据”);你意识到你的检查是在你启动线程后立即执行的,而不是在线程结束时执行的?@GSerg,但我没有得到´´´´MessageBox.Show(“请输入数据”);'''''消息。