2009-12-13 151 views
1

不知道我是否做錯了什麼......但我試圖實現可以從WCF調用的WCF服務。我實現了客戶端上的異步模式,這裏的電話是什麼樣子:從Silverlight掛起的WCF呼叫掛起

BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); 
EndpointAddress endpointAddress = new EndpointAddress(AccountServiceURL); 
var personService = new ChannelFactory<IAccountService>(basicHttpBinding, endpointAddress).CreateChannel(); 

var result = personService.BeginRegister(username, password, email, null, null); 
personService.EndRegister(result); // <-- failing here 

它掛在「EndRegister」呼......它只是坐在那裏,什麼都不做。而firefox.exe變得沒有響應。由於我在方法調用中有一個斷點,因此服務器似乎不會接收到調用。也許有人可以看到我做錯了什麼?

合同看起來像這樣在客戶端上:

[ServiceContract] 
public interface IAccountService 
{ 
    [OperationContract(AsyncPattern = true)] 
    IAsyncResult BeginRegister(string username, string password, string email, AsyncCallback callback, Object state); 

    void EndRegister(IAsyncResult result); 
} 

像這樣在服務器上:

[ServiceContract] 
public interface IAccountService 
{ 
    [OperationContract] 
    void Register(string username, string password, string email); 
} 

回答

2

如果你撥打的UI線程(你可能是)上,然後它會讓你的Silverlight運行時崩潰。這最後一個電話......

personService.EndRegister(result); 

...是要阻止,並在我的經驗Silverlight運行時真的,真的很討厭當UI線程阻塞上的IO呼叫這樣得到。您應該對事件或回調作出響應,然後在該事件或回調處理程序中進行EndRegister調用。

+0

就是這樣!謝謝傑森 – 2009-12-15 00:55:36

0

據我所知,這是因爲Silverlight的WCF基礎結構根本不使用ThreadPool。因此,要的BeginXXX的調用是不是真的異步調用...

我也迷迷糊糊在這個非常奇怪的行爲:

var ar = svc.BeginXxx(null, null); 
var response = svc.EndXxx(ar); 

和我們的應用程序handgs。