2012-11-15 34 views
0

可能重複:
WCF Windows Service - Long operations/Callback to calling module線程在WCF basicHttpBinding的

我必須託管在Windows服務WCF應用程序。我必須使用basicHttpBinding。在應用程序中,我對數據進行長期分析,然後將其轉化爲客戶。

是否有可能調用WCF創建一個將執行分析的線程(該線程的Id將被髮送到客戶端)?

客戶端應該能夠與使用傳輸ID的主題進行通信,並且如果它接收到數據已準備好的信息,則應該能夠下載它。這將反過來釋放線程。

如何實現此功能?

好的。有用。客戶端方法調用創建一個線程,即使在支付guid後臺運行並保存操作的結果。如何最好地存儲這些結果?由於該服務正在運行每次調用字典重置與每個調用該服務的事實。聲明靜態數據可以被覆蓋,但我認爲這不是一個好主意。有任何想法嗎?

namespace WCFRiskService 
{ 
    [ServiceContract] 
    public interface IRiskService 
    { 
     // return Thread ID 
     [OperationContract] 
     int GetAnalysis(AnalysisId); 

     [OperationContract] 
     string GetAnalysisData(int ThreadId); 
    } 

    public class Analysis 
    { 
     public GenerateAnalysis() 
     { 
      Thread.Sleep(20000); 
      Analysis = "Generated Data"; 
     } 
    } 

   public class RiskService : IRiskService 
    { 
     // How can I change this, to use non-static objects ? 
     static string AnalysisData = ""; 

     public string GetAnalysisData(int ThreadId); 
     { 
      return AnalysisData; 
     } 

     public int GetAnalysis(AnalysisId); 
     { 
      Analysis AObject = new Analysis(); 
      AObject.Tree = AnalysisTree; 
      Thread workerThread = new Thread(AObject.GenerateAnalysis); 
      int managedThreadId = workerThread.ManagedThreadId; 

      workerThread.Start(); 
      while (!workerThread.IsAlive) ; 

      return managedThreadId; 
     } 
    } 
} 
+0

我不知道該怎麼去做。我只想使用basicHttpBinding的WCF應用程序,以便從服務的所有請求共有的線程中受益,並在必要時終止線程。 –

回答

0

您可以創建爲每個作業的作業ID(Guid),並將其傳遞迴客戶端。然後在服務中,將作業ID存儲在ConcurrentDictionary<Guid, AnalysisResult>上,當客戶端詢問結果時,返回與作業ID對應的AnalysisResult。客戶端需要檢查操作返回的AnalysisResult是否爲空等。

請注意,輪詢不是最好的方法。

如果你可以用wsDualHttpBinding代替basicHttpBinding然後看看duplex services,它允許兩個端點發送消息。這樣服務器可以隨時向客戶端發送消息。您可以爲進度報告創建一個回調界面。