【发布时间】:2017-03-17 16:34:09
【问题描述】:
我正在创建一个 vb.net 桌面应用程序。此应用程序包括一些异步功能。当用户通过右上角的红色 X 关闭应用程序时,有一些逻辑可能运行这些异步函数中的一个或多个。问题是,程序在完成之前就终止了。我认为在通话中使用“Await”可以做到这一点,但显然不是。
我找到了this thread that talks about using ManualResetEvent,但我无法理解所有内容,特别是因为问题是在控制台应用程序的上下文中,而答案链接到的 MSDN 文档是关于指定线程,而不是简单地使用异步任务。作为尝试使用它,我尝试将其添加到我的主表单中:
Public resetEvent As ManualResetEvent = New ManualResetEvent(False)
在调用这些函数之一之后,我立即添加了这个(引用包括调用):
Await activeCount.SerializeAsync(activeCount)
resetEvent.WaitOne()
在我的异步函数本身的末尾,在返回任务之前,添加了这个:
frmMain.resetEvent.Set()
不过,我认为我没有正确使用它。无论如何,程序在完成之前仍然会终止。
甚至在那之前,我认为这样的事情最好的地方是ApplicationEvents MyApplication_Shutdown,但我不确定如何知道这样的功能是否仍在运行。
那么在这种情况下应用程序终止之前确保我的所有异步函数完成的最佳方法是什么?
谢谢!
接受答案后更新:
虽然 F0r3v3r-A-N00b 的回答有效,但我意识到在某些情况下我需要使用对话框。我无法在后台工作人员中调用它,因为对话框位于 GUI 线程上,而不是后台线程上。我试着移动一些东西,所以我会先调用对话框,然后让后台工作人员等等,但无论出于何种原因,我都无法让它工作。
长话短说,我通过简单地制作我的函数的同步版本来解决它,所以我可以说'如果用户终止程序并且我需要在关闭之前调用这些函数中的任何一个,请调用同步版本'。这样可行。谢谢!
【问题讨论】:
标签: vb.net asynchronous task terminate