Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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

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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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# 如何在主窗体中等待工作线程?_C#_Multithreading - Fatal编程技术网

C# 如何在主窗体中等待工作线程?

C# 如何在主窗体中等待工作线程?,c#,multithreading,C#,Multithreading,在读了几篇文章之后,我仍然不确定我是否理解多线程来解决我的问题 特别的问题 我有一个主窗体,它将启动一个后台工作线程(worker)。工作线程将执行While(!Stopping)无限循环,并将在每次迭代结束时休眠,并由全局停止对象(只读锁对象)终止。当用户按下停止按钮时,工作正常 工作进程将在当前迭代后停止 现在我想当用户关闭主窗体时,它将首先设置停止标志,让工作线程 完成当前的工作。之后,主窗体将关闭。看起来很简单,但我不能让它工作 我在while循环中尝试了worker.Join()或te

在读了几篇文章之后,我仍然不确定我是否理解多线程来解决我的问题 特别的问题

我有一个主窗体,它将启动一个后台工作线程(worker)。工作线程将执行While(!Stopping)无限循环,并将在每次迭代结束时休眠,并由全局停止对象(只读锁对象)终止。当用户按下停止按钮时,工作正常 工作进程将在当前迭代后停止

现在我想当用户关闭主窗体时,它将首先设置停止标志,让工作线程 完成当前的工作。之后,主窗体将关闭。看起来很简单,但我不能让它工作

我在while循环中尝试了worker.Join()或test woker.IsAlive,但由于某种原因,这两种情况都会在几秒钟后锁定应用程序(主窗体)

以下是我在Form_关闭事件处理程序中的代码(不工作):

有趣的是,工作线程似乎总是在每次循环迭代结束之前写入日志事件,然后日志项的其余部分将成为内部的主窗体事件
while(worker.IsAlive)循环。

您正在创建一个死锁,在您请求的任何位置放置一个断点并释放锁定对象。您还可以使用该类来测试锁是否可用,而不是创建死锁。非常熟悉VS中的线程窗口。

Join将始终等待线程,在UI线程中使用它将使应用程序看起来被锁定。 IsAlive不要阻止GUI线程中的任何内容,这是您的线程。睡眠

改为做这样的事情:

while (worker.IsAlive)
{
    Thread.sleep(50);
    Application.DoEvents();
}

请记住,您使用的任何代码如果导致UI线程暂停其正常的发送消息义务,都会对用户造成挂起。换句话说,不要调用任何可能阻塞的方法,包括
Thread.Join
Thread.Sleep
WaitHandle.WaitOne

由于您希望工作线程在关闭窗体时终止,因此我建议在停止信号发送到工作线程后让窗体关闭。添加一个
线程。在调用
应用程序后,加入对应用程序入口点的
调用。运行
。由于您正在关闭应用程序,因此如果线程没有及时响应,可以安全地调用
Thread.Abort
。下面是一些示例代码

public void Main(string[] args)
{
  var form = new YourForm();
  Application.Run(form);
  if (!form.WorkerThread.Join(TIME_TO_WAIT))
  {
    form.WorkerThread.Abort();
  }
}

不幸的是,这是我们需要.NET4.0的第一个项目,因此我目前正在使用VS2010 Express。看起来它没有用于调试的线程窗口。感谢Brian Gideon,我确实测试了您的解决方案,但我的主窗体将立即关闭。问题是我并不真正理解您的解决方案,也不确定我是否以正确的方式实现了它。基本上,我现在只调用Stop()来设置窗体关闭事件中工作线程的停止标志。我认为在这一点上,我的主窗体将被关闭,执行将返回到program.cs的行:if(!Form.WorkerThread.Join(TIME_to_WAIT)),但由于主窗体在那一点上关闭,并且似乎记录器函数在那一点上也不工作,我如何知道从那一点上发生了什么?
public void Main(string[] args)
{
  var form = new YourForm();
  Application.Run(form);
  if (!form.WorkerThread.Join(TIME_TO_WAIT))
  {
    form.WorkerThread.Abort();
  }
}