Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么线程IsAlive即使在线程内执行最后一个命令后也返回false_C#_Multithreading - Fatal编程技术网

C# 为什么线程IsAlive即使在线程内执行最后一个命令后也返回false

C# 为什么线程IsAlive即使在线程内执行最后一个命令后也返回false,c#,multithreading,C#,Multithreading,我在标签单击事件中启动了一个线程。线程完成了它的任务。我甚至得到了线程中的最后一个消息框。我想在完成线程后在label click事件中执行更多指令。因此,我使用了一个带有线程的IsAlive属性的if语句。看起来线程的IsAlive属性值总是true。怎么用?如何确保所有线程在我关闭应用程序时结束,还是在我关闭应用程序时自然结束 private void lbl\u Calc\u单击(对象发送方,事件参数e) { 标签=(标签)发送者; //执行计算的新线程 螺纹t=新螺纹(()=>Threa

我在标签单击事件中启动了一个线程。线程完成了它的任务。我甚至得到了线程中的最后一个消息框。我想在完成线程后在label click事件中执行更多指令。因此,我使用了一个带有线程的
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(“请输入数据”);'''''消息。