2011-07-31 160 views
0

,我讀了使用WCF代理的最佳做法是:WCF關閉最佳實踐

YourClientProxy clientProxy = new YourClientProxy(); 

try 
{ 
    .. use your service 
    clientProxy.Close(); 
} 
catch(FaultException) 
{ 
    clientProxy.Abort(); 
} 
catch(CommunicationException) 
{ 
    clientProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    clientProxy.Abort(); 
} 

我的問題是,後我分配我代理,我給你的事件處理程序,它也使用初始化其他方法代理:

public void InitProxy() 
{ 
    sdksvc = new SdkServiceClient(); 
    sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted); 
    sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD); 
    sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted); 
    sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted); 
} 

我現在需要調用InitProxy()方法,每個如果我想作爲最佳實踐建議使用它我使用代理時間。

有關如何避免這種情況的任何想法?

+0

每次調用WCF服務後,您不必調用'.Close()' - 只要沒有錯誤,您可以再次使用該代理進行另一次調用。關於這個最佳做法的一點是,你不應該把你的WCF代理調用放入一個'using(....){....}'塊中,因爲該塊將在關閉'}處置代理並關閉WCF代理可能會導致一個異常,而這個異常不會被use塊察覺。 –

+0

可能重複的[WCF客戶端使用\'塊問題是什麼是最好的解決方法?](http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the- WCF的客戶端使用塊發出) –

回答

0

有幾種選擇。一種選擇是寫一個輔助類,如下所示:

public class SvcClient : IDisposable { 
    public SvcClient(ICommunicationObject service) { 
     if(service == null) { 
     throw ArgumentNullException("service"); 
     } 
     _service = service; 
     // Add your event handlers here, e.g. using your example: 
     sdksvc = new SdkServiceClient(); 
     sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted); 
     sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD); 
     sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted); 
     sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted); 
    } 
    public void Dispose() { 
     try { 
     if(_service.State == CommunicationState.Faulted) { 
      _service.Abort(); 
     } 
     } 
     finally { 
     _service.Close(); 
     } 
    } 
    private readonly ICommunicationObject _service; 
} 

要使用這個類來寫:

var clientProxy = new YourClientProxy(); 
using(new SvcClient(clientProxy)) { 
    // use clientProxy as usual. No need to call Abort() and/or Close() here. 
} 

SvcClient的構造函數被調用它,然後根據需要設置了SdkServiceClient實例。此外,SvcClient類會清理服務客戶端代理,並根據需要中止和/或關閉連接,而不管控制流程如何離開012Blocker。

0

我不明白ClientProxy和InitProxy()是如何鏈接的,但如果它們鏈接的很強,我會將ClientProxy的初始化移動到InitProxy(或者創建一個初始化兩者的方法),以便您可以從那裏控制他們的壽命。