C# 在WPF窗口关闭时终止线程
我创建了一个小的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="
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
}
}