[英]Exit a windows console application to clean up resources
我有一个控制台应用程序,其中通过tcp / ip连接到远程服务器上的第三方Windows服务。
呼叫层次结构喜欢:
static class Program
{
[MTAThread]
static void Main()
{
MyApplication.Start();
Start
方法
public static void Start()
{
lock (SyncVar)
{
ThreadStart ts = new ThreadStart(MainCode);
MainCodeThread = new Thread(ts);
MainCodeThread.IsBackground = false;
MainCodeThread.Start();
主线程的细节有:
private static void MainCode()
{
try
{
// connect to the remote server, against a windows service
TelephonyServer tServer = new TelephonyServer(sIpaddress, "username", "password");
while (true)
{
Task consumer = Task.Run(() =>
{
if (data != "")
{
ProcessEachChannel(data);
});
Task producer = Task.Run(() =>
{
// blah blah
});
在ProcessEachChannel
方法中,我们有
public bool ProcessEachChannel(string workItem)
{
ChannelResource cr = tServer.GetChannel();
// blah blah
}
现在,该应用程序运行良好。 但是,如果我单击应用程序的红色出口叉或单击Visual Studio中的“停止调试”按钮,则ChannelResource cr
资源根本不会被销毁。 我从远程服务器服务控制仪表板找到了事实。
我尝试了一些代码
System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess(); process.Exited += new EventHandler(OnExited);
没有帮助。 我听到了一些技巧,可以通过将参数传递给主线程来管理线程,然后设置true
或false
等,但没有任何线索。
在所有正在运行的线程停止之前,程序不会退出。
将线程代码中的while (true)
替换为while (true)
while (!stopThread.WaitOne(10, false))
,其中stopThread
是一个WaitHandle
如ManualResetEvent
。
然后,当应用程序关闭时, Set
事件并等待线程退出。
还要注意,某些第3方框架依赖于在其对象上调用Dispose
,因为它们需要管理它们产生的某些单独线程的生存期。 Fe阅读了VoiceElements document
,了解它们如何调用从GetChannel()
获得的ChannelResource
上的Disconnect
和Dispose
。 请在何时何地需要自己释放使用过的资源时与提供商联系。
如果您终止进程,而不是优雅地关闭进程(这是您在关闭控制台窗口或在调试器中按stop按钮时所执行的操作),则没有机会运行任何清理代码。 您必须实现一些退出处理程序,也许是按ctrl-c按下然后从线程返回,以便所有对象可以干净地处置自己。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.