繁体   English   中英

退出Windows控制台应用程序以清理资源

[英]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);

没有帮助。 我听到了一些技巧,可以通过将参数传递给主线程来管理线程,然后设置truefalse等,但没有任何线索。

在所有正在运行的线程停止之前,程序不会退出。

将线程代码中的while (true)替换为while (true) while (!stopThread.WaitOne(10, false)) ,其中stopThread是一个WaitHandleManualResetEvent

然后,当应用程序关闭时, Set事件并等待线程退出。

还要注意,某些第3方框架依赖于在其对象上调用Dispose ,因为它们需要管理它们产生的某些单独线程的生存期。 Fe阅读了VoiceElements document ,了解它们如何调用从GetChannel()获得的ChannelResource上的DisconnectDispose 请在何时何地需要自己释放使用过的资源时与提供商联系。

如果您终止进程,而不是优雅地关闭进程(这是您在关闭控制台窗口或在调试器中按stop按钮时所执行的操作),则没有机会运行任何清理代码。 您必须实现一些退出处理程序,也许是按ctrl-c按下然后从线程返回,以便所有对象可以干净地处置自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM