2012-10-15 49 views
1

在同步模式,它只是如何在使用語句中調用異步wcf方法?

using (MyServiceClient msc = new MyServiceClient()) 
{ 
    msc.Method(); 
} 

,但如果我必須等待這個方法的末尾,然後做一些事情,它不能正常工作

private void EventHandler<MethodCompletedEventArgs> myEventHandler = new EventHandler<MethodCompletedEventArgs>(methodBody); 

using (MyServiceClient msc = new MyServiceClient()) 
{ 
    msc.MethdCompleted += myEventHandler; 
    msc.BeginMethod(); 
} 

private void MethodBody() 
{ 
//exception: client state is aborted 
} 

而且如何調用異步mehod在using聲明?

+0

哪種類型的應用程序正在調用該服務? –

+4

在您的事件處理程序中調用Dispose –

回答

1

您可以存儲對服務客戶端的引用,並在事件回撥後手動調用其方法Dispose。你只需要做一些額外的工作來管理異常,並且通常確保最終調用Dispose。另請注意您可能在等待舊版本完成時創建/覆蓋msc的多個實例的情況:

確保在多次執行相同代碼時不會丟棄錯誤實例的一種方法是使用本地拉姆達/匿名功能:

MyServiceClient msc = new MyServiceClient(); 

msc.MethdCompleted += (sender, args) => 
{ 
    try 
    { 
     myEventHandler(sender, args); 
    } 
    finally 
    { 
     msc.Dispose(); 
    } 
}; 

msc.BeginMethod(); 

它可能會比這更混亂;如果在msc.BeginMethod()上拋出異常,您應該很好地理解並且最有可能致電Dispose(但您不想多次撥打Dispose

+0

這還不夠。 Dispose方法調用Close(),它通過網絡進行呼叫以通知另一方拆除連接。如果連接處於Fault,Closing或Closed狀態,則Close()調用將引發異常,並且資源不會被清理。如果發生這種情況,您需要調用Abort()。所以簡單地使用try/finally或使用(){}是不安全的... – Craig

6

你不應該這樣做。

您應該正常實例化MyServiceClient,然後在異步回調處理程序中將其Dispose

這是確保實例在調用回調處理程序後仍然存在的唯一方法,並且在回調處理程序完成其工作後它將被銷燬。