Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 如何在窗口关闭按钮单击时终止wpf应用程序中的所有线程_C#_Wpf - Fatal编程技术网

C# 如何在窗口关闭按钮单击时终止wpf应用程序中的所有线程

C# 如何在窗口关闭按钮单击时终止wpf应用程序中的所有线程,c#,wpf,C#,Wpf,我已经创建了一个WPF应用程序。在我的应用程序中运行两个线程: 第一个线程异步侦听端口40010上的TCP数据包,并将数据推送到MSMQ 来自MSMQ的第二个线程pop数据 当我通过单击窗口关闭按钮关闭应用程序时,它不会显示任何错误。 但当我再次启动应用程序时,它会引发异常: Unable to start Listrner : Only one usage of each socket address (protocol/network address/port) is normal

我已经创建了一个WPF应用程序。在我的应用程序中运行两个线程:

  • 第一个线程异步侦听端口40010上的TCP数据包,并将数据推送到MSMQ
  • 来自MSMQ的第二个线程pop数据
  • 当我通过单击窗口关闭按钮关闭应用程序时,它不会显示任何错误。 但当我再次启动应用程序时,它会引发异常:

    Unable to start Listrner : Only one usage of each socket address 
        (protocol/network address/port) is normally permitted
    

    当我重新启动电脑时,它第一次成功运行,但在关闭应用程序时,它不再工作

    您不应终止线程

    你应该做的是提供一个很好的方式让他们完成。关闭应用程序时,应设置一些变量:

    volatile bool shouldClose;
    
    在你的线程中使用这个变量,比如在弹出下一个包之前,停止无限循环

    至于主应用程序,它应该等待线程完成


    有关volatile关键字,请参见。

    +,总结一下:这是取消令牌模式,例如在.Net 4.0(,)中为
    系统.Threading.Task.Task
    引入的-因此,如果您使用.Net 4.0并使用任务,您可以简单地使用该例程(并且应该)!