我有一個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.尚未。它只是發送一條消息給客戶端。 2.直到例外被調用需要一分鐘。如果我在兩種不同的方法中使用sendMessageToClient()函數,它會工作得很好,但是如果我一個接一個地編寫它們(sendMessageToClient(client,message1); sendMessageToClient(client,message2);'我得到超時 – Manuel
如果你改爲 [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,UseSynchronizationContext = false)] – Yoztastic
Yoztastic你解決了我的問題!!對我感到羞恥,我從來沒有嘗試過.Multiple:D謝謝! – Manuel