在WPF窗口上终止线程关闭

时间:2018-08-17 17:44:51

标签: c# wpf multithreading window

我创建了一个小的wpf窗口应用程序。 MainWindow有一个按钮,当按下该按钮时,将创建一个线程并开始执行该线程。以下是我的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>

这是我的.cs代码的样子:

public partial class MainWindow : Window
{
    private Thread t1;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void OnWindowclose(object sender, EventArgs e)
    {
        System.Windows.Application.Current.Shutdown();
    }

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


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

现在,我的问题是当我使用其关闭按钮关闭MainWindow时。我仍然可以看到该应用程序尚未停止。在阅读了一些stackoverflow帖子之后,我尝试了一些方法,并创建了一个事件OnWindowClose并称为应用程序关闭。但这似乎并没有达到预期效果。

我不想调用Thread.Abort(),因为它会引发异常,论坛建议不要这样做。这个post似乎与我要实现的目标相似,但是仍然没有得到如何使用它来关闭窗口中的线程的信息。

我对线程还很陌生,所以不确定如何解决该问题。任何帮助,将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

使所有线程在后台运行

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
    }
}