0

我正在开发一个通信 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 完成:不是我想要的做。

你能帮我修复我的代码并获得我的目标吗?

谢谢!

4

1 回答 1

0

autoResetEvent- 控制主连接生命周期。我看不到您通过调用取消订阅事件来释放Set()此句柄的位置OnMessageArrived

autoResetEvent2- 控制传入消息,只有在收到带有预期 GUID 的消息时才设置此事件,基本上只是

if (guid == currentGUI.ToString())
{
   autoResetEvent2.Set(); 
}

还要为变量使用更清晰和描述性的名称,以便更容易编写和理解代码

于 2012-09-04T08:43:29.300 回答