【问题标题】:Terminating a thread on WPF window close [duplicate]在WPF窗口关闭时终止线程[重复]
【发布时间】:2018-08-17 17:44:50
【问题描述】:

我创建了一个小型 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 似乎与我想要实现的目标相似,但我仍然不知道如何使用它来停止关闭窗口中的线程。

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

谢谢。

【问题讨论】:

  • CancelationToken

标签: c# wpf multithreading window


【解决方案1】:

让所有线程在后台运行

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 属性会使所有线程都依赖于父窗口线程对吗?因此关闭主窗口会导致相关线程也关闭。
  • 是的先生,看这个例子/解释docs.microsoft.com/en-us/dotnet/api/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2016-01-22
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
相关资源
最近更新 更多