2009-01-09 110 views

回答

23

您可以使用singleton pattern來保留每個Web服務的單個實例,而不用擔心處置您的Web服務。 Web服務是無狀態的,因此它們可以安全地在Web服務器上的連接和線程之間共享。

以下是可用於保存對Web服務實例的引用的Web服務類的示例。這個單例是懶惰和線程安全的。建議如果你讓你的單身人士懶惰,他們也會按照相同的邏輯保持線程安全。要詳細瞭解如何執行此操作,請閱讀Implementing Singletons上的C#深度文章。

還請記住,您可能遇到WCF Web服務的問題。我建議閱讀WCF's instance management techniques article,特別是單身部分,瞭解更多詳情。

public static class WS 
{ 
    private static object sync = new object(); 
    private static MyWebService _MyWebServiceInstance; 

    public static MyWebService MyWebServiceInstance 
    { 
     get 
     { 
      lock (sync) 
      { 
       if (_MyWebServiceInstance == null) 
       { 
        _MyWebServiceInstance= new MyWebService(); 
       } 
      } 
      return _MyWebServiceInstance; 
     } 
    } 
} 

然後當你需要訪問你的網絡服務,你可以這樣做:

WS.MyWebServiceInstance.MyMethod(...) 

var ws = WS.MyWebServiceInstance; 
ws.MyMethod(...) 

我已經成功地使用了幾個項目,它這個模式運行良好,但正如tvanfosson在下面的評論中提到的,更好的策略是使用DI框架來管理您的Web服務實例。

+0

謝謝!我現在肯定會實現一個使用。 – BeaverProj 2009-01-11 19:02:18

+0

@DanHerbert,我們對你的問題公開提供了修訂控制。所以你不需要用大量劃掉的東西來混亂你的帖子。它令人分心 – mmcdole 2009-01-16 03:42:12

1

我認爲DataService繼承了Dispose組件。

0

你想在這裏完成什麼?

如果您擔心性能,那麼我會更擔心託管web服務的服務器的響應速度和網絡速度,因爲它們會顯着影響您等待Web服務調用完成的時間長度(除非它的異步)。

MSDN上的示例沒有調用Dispose,它的顯然是垃圾收集器將會完成它的工作,所以除非你的實時系統需要每秒處理超過100,000條記錄,否則你可能不會需要想出一種處理資源或管理內存的方法。

1

實現IDispose的對象應該手動處理以協助垃圾收集器。

如果您的對象是短暫使用using塊。對於可以保留的對象,確保它們保留的對象在處置它們時也將它們處理掉。

相關問題