0

所有していないAPIからのログオンプロセスがあり、ときどきハングします。たとえば、30秒より長くかかる場合は、それを強制終了して再試行します(2〜3秒程度しかかからないため)。

スレッドの中止がどのように機能するか、中止後に参加する必要があるかどうかについて少し混乱しています。これが私の質問とそれに続く私がやろうとしていることの例です:

質問:

  1. Abortは、呼び出されたスレッドでスレッド中止例外をスローします。それは伝播しますか?呼び出し元のスレッドで明示的に処理する必要がありますか、それともスレッドが停止するだけですか?

  2. 中止されたスレッドに参加して、ゾンビ化しないようにする必要がありますか、それとも* NIXプログラミングの世界から混乱しているだけですか?

    public static Session GetSession()
    {
        Session session = new Session("user", "pass");
    
        try
        {
            //Create a thread to get the session so we can kill it if it hangs.
            Thread thread = new Thread(() => session.Logon());
    
            //Create a thread to kill the session thread if it hangs.
            Thread watcher = new Thread(() => HangKill(thread));
    
            //Start both threads.
            thread.Start();
            watcher.Start();
    
            //Wait for session thread to finish - abort kill thread if it does.
            thread.Join();
            watcher.Abort();
            watcher.Join();
        }
        catch (Exception ex)
        {            
            status = ex.ToString();
        }
    
        return session;
    }
    
    
    public static void HangKill(Thread t)
    {
        Thread.Sleep(30);
    
        if (t.IsAlive == true)
        {
            t.Abort();
        }
    }
    
4

1 に答える 1

1

独自のプロセスでスレッドを中止することは危険です。(ただし、他のプロセスと同様に。)スレッドがいくつかのロックを所有している場合や、重要な構造を更新している場合などがあります。したがって、これは進むべき道ではありません。

問題のサービスを別のプロセスに含めることをお勧めします。これにより、問題が発生した場合にそのプロセスを強制終了できます。そのプロセスとの通信にはIPC(共有メモリ?WCF?)を使用します。

于 2012-07-19T15:42:19.123 に答える