2012-12-21 39 views
1

我有一個webservice,它在被調用時產生一個子線程。子線程本身有一個控制循環,應該運行直到它被告知在將來某個時刻終止。在Web服務調用中創建子線程後停止

我使用下面的代碼:

namespace MyService 
{ 
    public class MyService : IMyService 
    { 
     // Starts a new worker loop on a new thread 
     public bool startMyProcess(string Name, Guid ID) 
     { 
       try 
       { 
        // Get DB connection 
        string dbConn = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 
        TManagement tManagement = new TManagement(dbConn); 

        // If a valid ID has been entered, create a new thread 
        if (tManagement.validateID(ID) == 0) 
        { 
         MainLoop myWorker = new MainLoop(); 
         Thread bw = new Thread(() => myWorker.startWebServiceLoop(Name, ID)); 
         bw.Start(); 
         return true; 
        } 
        else 
        { 
         return false; // The ID is invalid 
        } 
       } 
       catch 
       { 
        // An error has occurred 
        return false; 
       } 
     } 
    } 
} 

然而,經過幾次成功的循環(做同樣的事情)線「BW」終止。

我想這個子線程無限期地繼續。我懷疑一旦web服務線程終止,子線程被殺死。有沒有辦法避免這種情況?

+0

野性未受教育的猜測:是否將線程的'IsBackground'設置爲'false'幫助? –

+2

這有點令人困惑:如果服務線程終止,那麼你的線程也應該終止。爲什麼你希望線程在服務線程退出後繼續運行?無論如何,我們不知道線程的控制循環中有什麼,所以很難說出線程爲什麼退出(即可能是因爲控制循環有導致線程退出的條件)。 – Kiril

+0

@DanAbramov如果OP想要線程在服務線程終止後繼續運行,那麼'IsBackground'應該是'false'。 – Kiril

回答

1

更好的設計是使用Windows服務來託管長時間運行的線程。您的Web服務可以通過Windows服務託管的小型WCF服務與Windows服務進行通信。

Windows服務中的線程可以持續,只要他們需要持續。 Web服務專爲請求/響應範例而設計,聽到它並不總是記錄非直接由於客戶請求而導致的事情。