Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/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# 在WPF窗口关闭时终止线程_C#_Wpf_Multithreading_Window - Fatal编程技术网

C# 在WPF窗口关闭时终止线程

C# 在WPF窗口关闭时终止线程,c#,wpf,multithreading,window,C#,Wpf,Multithreading,Window,我创建了一个小的wpf窗口应用程序。main窗口有一个按钮,按下该按钮时,将创建一个线程并开始执行。下面是我的xaml代码: <Window x:Class="Tester.MainWindow" ... Title="MainWindow" Height="150" Width="300" Closed="OnWindowclose"> <Grid> <Button Content="Start" HorizontalAlignment="

我创建了一个小的wpf窗口应用程序。
main窗口
有一个按钮,按下该按钮时,将创建一个线程并开始执行。下面是我的xaml代码:

<Window x:Class="Tester.MainWindow"
    ...
    Title="MainWindow" Height="150" Width="300" Closed="OnWindowclose">
<Grid>
    <Button Content="Start" HorizontalAlignment="Left" Margin="42,47,0,0" VerticalAlignment="Top" Width="75" Click="Start_Click"/>
</Grid>
现在,我的问题是当我用关闭按钮关闭
main窗口时。我仍然可以看到应用程序没有停止。在阅读了一些stackoverflow文章之后,我尝试了一些方法,创建了一个事件
OnWindowClose
,并调用了应用程序关闭。但这似乎并不像预期的那样奏效

我不想调用Thread.Abort(),因为它会抛出异常,论坛建议不要使用它。这看起来和我想要实现的类似,但我仍然不知道如何使用它在关闭窗口中停止线程

我对线程相当陌生,所以我不确定我能做些什么来解决这个问题。任何帮助都将不胜感激


谢谢

使所有线程在后台运行

t1 = new System.Threading.Thread(KeepMoving);
t1.IsBackground = true;
t1.Start();
将环境结账添加到表单结账

Environment.Exit(Environment.ExitCode);
完整代码

public partial class MainWindow : Window
{
    private Thread t1;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void OnWindowclose(object sender, EventArgs e)
    {
        Environment.Exit(Environment.ExitCode); // Prevent memory leak
        // System.Windows.Application.Current.Shutdown(); // Not sure if needed
    }

    private void Start_Click(object sender, RoutedEventArgs e)
    {
        move = true;
        t1 = new System.Threading.Thread(KeepMoving);
        t1.IsBackground = true; // Run in background
        t1.Start();
    }


    private void KeepMoving()
    {
    // my code
    }
}

environment.exit与thread.abort具有相同的效果。实际上,我认为将它们设置为背景可能不够好,因此设置IsBackground属性使所有线程都依赖于父窗口线程正确??因此,关闭主窗口也会导致从属线程关闭
public partial class MainWindow : Window
{
    private Thread t1;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void OnWindowclose(object sender, EventArgs e)
    {
        Environment.Exit(Environment.ExitCode); // Prevent memory leak
        // System.Windows.Application.Current.Shutdown(); // Not sure if needed
    }

    private void Start_Click(object sender, RoutedEventArgs e)
    {
        move = true;
        t1 = new System.Threading.Thread(KeepMoving);
        t1.IsBackground = true; // Run in background
        t1.Start();
    }


    private void KeepMoving()
    {
    // my code
    }
}