Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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
.NET应用程序未关闭_.net_Multithreading_Backgroundworker - Fatal编程技术网

.NET应用程序未关闭

.NET应用程序未关闭,.net,multithreading,backgroundworker,.net,Multithreading,Backgroundworker,我有一个相当WPF的应用程序,它有一个奇怪的行为:在调试时关闭它之后,窗口会关闭,但调试(应用程序本身)仍在运行。我说的是单击窗口上的关闭按钮-通过单击停止调试工作来强制关闭 我猜即使UI线程完成,一些后台线程仍在运行我没有任何多线程代码使用线程类,但是我使用的是一个名为Ookii.Dialogs的库,其中包含一个ProgressWindow类,该类的使用方式非常类似于优秀的老BackgroundWorker。这个类是我的主要怀疑对象,但是我相信我使用它是正确的-只是在DoWork处理程序中处理

我有一个相当WPF的应用程序,它有一个奇怪的行为:在调试时关闭它之后,窗口会关闭,但调试(应用程序本身)仍在运行。我说的是单击窗口上的关闭按钮-通过单击停止调试工作来强制关闭

我猜即使UI线程完成,一些后台线程仍在运行我没有任何多线程代码使用
线程
类,但是我使用的是一个名为
Ookii.Dialogs的库,其中包含一个
ProgressWindow
类,该类的使用方式非常类似于优秀的老
BackgroundWorker
。这个类是我的主要怀疑对象,但是我相信我使用它是正确的-只是在
DoWork
处理程序中处理长时间运行的操作,通过调用
ReportProgress
显示进度,并用
Show()
方法启动它们,这类似于
RunWorkerAsync
,但它也会显示一个进度窗口。操作完成后,窗口将自动关闭


假设这不是库的错,用
BackgroundWorker
替换它(这是相同的,只是没有进度窗口)仍然会显示相同的症状。知道如何开始诊断此问题吗?

将Visual Studio附加到正在运行的进程并暂停它


查看线程及其正在执行的操作。

将Visual Studio附加到正在运行的进程并暂停它


看看线程及其正在做什么。

不确定您是否有相同的问题,但我们也遇到了类似的问题。 在
应用程序
类中,尝试设置
ShutdownMode=ShutdownMode.OnMainWindowClose
。默认值是最后一个窗口(即使没有打开任何窗口,这仍然是一个问题)


不确定你是否有同样的问题,但同样的情况发生在我们身上。 在
应用程序
类中,尝试设置
ShutdownMode=ShutdownMode.OnMainWindowClose
。默认值是最后一个窗口(即使没有打开任何窗口,这仍然是一个问题)


找到了!问题是我创建了一个从未显示的窗口实例。 这就是我所拥有的:

private CustomWindow myWindow;

public MainWindow() {
    this.myWindow = new CustomWindow();    
}

public void Button_Click(object sender, RoutedEventArgs e) {
    this.myWindow.Show();
}
即使我从未单击过按钮(因此窗口从未显示),仍然会创建一个窗口实例并在内存中等待。这阻止了应用程序关闭

这样更改代码修复了问题:

private CustomWindow myWindow;

public MainWindow() {

}

public void Button_Click(object sender, RoutedEventArgs e) {
    this.myWindow = new CustomWindow();   
    this.myWindow.Show();
}

现在只在需要显示窗口时创建窗口(无论如何,这是一种更好的方式),并且当窗口显示时,它实际上可以正确关闭-与第一种情况不同,当不单击按钮时,窗口处于一种奇怪的状态,“已创建但从未实际显示或关闭”,这阻止了应用程序关闭,因为正如crashmstr指出的,我的应用程序的默认关闭模式是OnLastWindowClose。

找到了它!问题是我创建了一个从未显示的窗口实例。 这就是我所拥有的:

private CustomWindow myWindow;

public MainWindow() {
    this.myWindow = new CustomWindow();    
}

public void Button_Click(object sender, RoutedEventArgs e) {
    this.myWindow.Show();
}
即使我从未单击过按钮(因此窗口从未显示),仍然会创建一个窗口实例并在内存中等待。这阻止了应用程序关闭

这样更改代码修复了问题:

private CustomWindow myWindow;

public MainWindow() {

}

public void Button_Click(object sender, RoutedEventArgs e) {
    this.myWindow = new CustomWindow();   
    this.myWindow.Show();
}

现在只在需要显示窗口时创建窗口(无论如何,这是一种更好的方式),并且当窗口显示时,它实际上可以正确关闭-与第一种情况不同,当不单击按钮时,窗口处于一种奇怪的状态,“已创建但从未实际显示或关闭”,这阻止了应用程序关闭,因为正如crashmstr所指出的,我的应用程序的默认关闭模式是OnLastWindowClose。

谢谢,这很有效!它避免了问题,而不是面对问题,但在这种情况下,我并不真正关心这一点,记住这一点肯定是很有用的谢谢,这个有用!它避免了问题,而不是面对问题,但在这种情况下,我并不真正关心这一点,记住这一点肯定是很有用的是的,你需要在你创建的任何窗口上调用Close(),即使它们没有打开。是的,你需要在你创建的任何窗口上调用Close(),即使它们没有打开。