2011-07-31 138 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(或者创建一个初始化两者的方法),以便您可以从那里控制他们的寿命。