2012-08-23 37 views
1

我有一個wcf回調程序,它可以發送消息給客戶端。當發送多條消息時,wcf回叫超時

如果我嘗試發送第二條消息,則整個程序會凍結,並且會得到一個超時錯誤。

這裏是servercode:

public void SendMessageToClient(string computerName, string message) 
    { 
     foreach (var session in connectedClients.Values) 
     { 
      if (session.ComputerName == computerName) 
      { 
       var asyncResult = session.Callback.BeginOnMessageReceived(message, new AsyncCallback(OnPushMessageComplete), session.Callback); 
       if (asyncResult.CompletedSynchronously) 
        CompletePushMessage(asyncResult); 
      } 
     } 
    } 
    void OnPushMessageComplete(IAsyncResult asyncResult) 
    { 
     CompletePushMessage(asyncResult);    
    } 

    void CompletePushMessage(IAsyncResult asyncResult) 
    { 
     var callbackChannel = (IServiceCallback)asyncResult.AsyncState; 
     try 
     { 
      callbackChannel.EndOnMessageReceived(asyncResult); 
     } 
     catch { } 
    } 

這是的callbackInterface:

[OperationContract(IsOneWay = true, AsyncPattern = true)] 
    IAsyncResult BeginOnMessageReceived(string message, AsyncCallback acb, object state); 
    void EndOnMessageReceived(IAsyncResult iar); 

這是客戶端代碼:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)] 
public class ServiceHandler : IServiceCallback 
{ 
    public delegate void MessageReceivedHandler(string message); 
    public event MessageReceivedHandler OnMessageReceivedEvent; 

    public void OnMessageReceived(string message) 
    { 
     if (this.OnMessageReceivedEvent != null) 
      this.OnMessageReceivedEvent(message); 
    } 
}  

void callback_OnMessageReceivedEvent(string message) 
    { 
     setlb_info(message) 
    } 
public void setlb_info(string wert) 
    { 
     if (this.lb_info.InvokeRequired) 
     { 
      setlb_infoCallback d = new setlb_infoCallback(setlb_info); 
      this.Invoke(d, new object[] { wert }); 
     } 
     else 
     { 
      this.lb_info.Text = wert; 
     } 

    } 

如果我試試這個:

Service.CurrentInstance.SendMessageToClient(client_name, message); 

客戶端將收到消息,但如果我第二次調用同樣的方法,我會得到timeoutexception(設置爲1分鐘)。

我使用代碼從這個項目(德國):

http://www.flexbit.at/blog/wcf-duplex-zwischen-windows-sevice-und-gui-frontend/

我希望有人能幫助我,因爲我不能完成我的工作,如果此功能將無法正常工作。

此致

編輯:我忘在客戶端的碼:

var callback = new ServiceHandler(); 
       callback.OnMessageReceivedEvent += new ServiceHandler.MessageReceivedHandler(callback_OnMessageReceivedEvent); 
       var callbackInstanceContext = new InstanceContext(callback); 
       client = new ServiceClient(callbackInstanceContext); 
       client.Subscribe(System.Environment.MachineName);  

回答

1

嘗試改變 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode 折返,UseSynchronizationContext =假)。] 到 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode。Multiple,UseSynchronizationContext = false)]

+0

1.尚未。它只是發送一條消息給客戶端。 2.直到例外被調用需要一分鐘。如果我在兩種不同的方法中使用sendMessageToClient()函數,它會工作得很好,但是如果我一個接一個地編寫它們(sendMessageToClient(client,message1); sendMessageToClient(client,message2);'我得到超時 – Manuel

+0

如果你改爲 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,UseSynchronizationContext = false)] – Yoztastic

+0

Yoztastic你解決了我的問題!!對我感到羞恥,我從來沒有嘗試過.Multiple:D謝謝! – Manuel