我正在开发一个通信 API,供许多通用客户端与专有系统通信。
这个专有系统公开了一个 API,我使用一个特定的类来发送和等待来自这个系统的消息:显然系统会使用事件提醒我消息已准备好。该事件被命名为 OnMessageArrived。
我的想法是公开一个简单的 SendSyncMessage(message) 方法,帮助用户/客户端简单地发送消息,该方法返回响应。
客户端:
using ( Communicator c = new Communicator() )
{
response = c.SendSync(message);
}
通信器类是这样完成的:
public class Communicator : IDisposable
{
// Proprietary system object
ExternalSystem c;
String currentRespone;
Guid currentGUID;
private readonly ManualResetEvent _manualResetEvent;
private ManualResetEvent _manualResetEvent2;
String systemName = "system";
String ServerName = "server";
public Communicator()
{
_manualResetEvent = new ManualResetEvent(false);
//This methods are from the proprietary system API
c = SystemInstance.CreateInstance();
c.Connect(systemName , ServerName);
}
private void ConnectionStarter( object data )
{
c.OnMessageArrivedEvent += c_OnMessageArrivedEvent;
_manualResetEvent.WaitOne();
c.OnMessageArrivedEvent-= c_OnMessageArrivedEvent;
}
public String SendSync( String Message )
{
Thread _internalThread = new Thread(ConnectionStarter);
_internalThread.Start(c);
_manualResetEvent2 = new ManualResetEvent(false);
String toRet;
int messageID;
currentGUID = Guid.NewGuid();
c.SendMessage(Message, "Request", currentGUID.ToString());
_manualResetEvent2.WaitOne();
toRet = currentRespone;
return toRet;
}
void c_OnMessageArrivedEvent( int Id, string root, string guid, int TimeOut, out int ReturnCode )
{
if ( !guid.Equals(currentGUID.ToString()) )
{
_manualResetEvent2.Set();
ReturnCode = 0;
return;
}
object newMessage;
c.FetchMessage(Id, 7, out newMessage);
currentRespone = newMessage.ToString();
ReturnCode = 0;
_manualResetEvent2.Set();
}
}
我真的不喜欢使用waithandle,但我的想法是创建一个发送消息并等待事件的实例。一旦事件到达,检查消息是否是我期望的(检查唯一的 guid),否则继续等待下一个事件。这是因为可能(并且通常以这种方式)许多客户端同时工作,我希望它们并行工作。当我实现我的东西时,目前如果我运行客户端 1、客户端 2 和客户端 3,客户端 2 在客户端 1 完成后立即开始发送消息,客户端 3 作为客户端 2 完成:不是我想要的做。
你能帮我修复我的代码并获得我的目标吗?
谢谢!