C# WCF上的单向事件日志记录阻止线程

C# WCF上的单向事件日志记录阻止线程,c#,wcf,asynchronous,callback,oneway,C#,Wcf,Asynchronous,Callback,Oneway,我想在WCF回调通道上使用单向事件记录一些操作 我有几种方法,比如: [OperationContract(IsOneWay = true)] void LogSomething(String txt); 在我的回拨频道。 我正在迭代每个订阅的logger实例以发送消息,但是如果其中一个无法正确断开连接并且无法关闭通道连接,则整个应用程序将挂起。然后甚至检查: ((ICommunicationObject)callback).State == CommunicationState.Opened

我想在WCF回调通道上使用单向事件记录一些操作

我有几种方法,比如:

[OperationContract(IsOneWay = true)]
void LogSomething(String txt);
在我的回拨频道。 我正在迭代每个订阅的logger实例以发送消息,但是如果其中一个无法正确断开连接并且无法关闭通道连接,则整个应用程序将挂起。然后甚至检查:

((ICommunicationObject)callback).State == CommunicationState.Opened
返回true,因此我甚至无法检查通道是否已断开

已设置ConcurrencyMode.Multiple和InstanceContextMode.PerCall

处理这个问题的最佳方法是什么?我正在使用.NET4.0

根据我的研究,我需要将AsyncPattern设置为true,并将代码更改为:

[OperationContractAttribute(OneWay=true, AsyncPattern=true)]
IAsyncResult BeginLogSomething(String txt, AsyncCallback callback, object asyncState);

void EndLogSomething(IAsyncResult result);
但是有没有更好的方法呢?如果可能的话,我不希望更改客户端的代码——我仍然希望使用SynchronizationContext并逐个处理消息


我是否需要创建一个单独的线程来发送队列中的消息?

发送单个消息后是否处理客户端?还是对所有消息使用相同的WCF客户端代理?