ClrZmq总是将消息返回到第一个启动的客户端

时间:2014-07-22 07:27:45

标签: c# task-parallel-library clr zeromq akka-zeromq

我们正在创建一个WPF应用程序,我们在其中执行来自不同测试站的python脚本并在其相应的输出面板中显示输出。要并行运行脚本,我们使用Task但是当我们并行运行脚本时从车站,我们将其他车站的输出也输入到首先启动的车站,我们使用以下代码,

private void ZmqStatusListener(string endPoint)
{
    using (Context context = new Context())
    {
        StatusPort = string.Empty;
        TestResultPort = string.Empty;
        using (Socket server = context.Socket(SocketType.REP))
        {
            try
            {
                if (isStatusContextActive == false || isPortChanged == true)
                {
                    server.Bind(endPoint);
                    isStatusContextActive = true;
                }
            }
            catch (ZMQ.Exception ex)
            {
                if (ex.Errno != 100)
                {
                    string IPCPort = _globalParameters.GlbParam.GlbParamIpcStartPort;
                    if (IPCPort == string.Empty)
                    {
                        IPCPort = "0";
                    }
                    if (endPoint == EditorConstants.PortAddress.PortPrefix + IPCPort)
                    {
                        StatusPort = endPoint;
                        TestReultError = EditorConstants.CommonMessageTypes.TestReultError + ex.Message + EditorConstants.CommonMessageTypes.StackTraceMessage + ex.StackTrace;
                    }
                    StopExecOfScript(default(object));
                    isCancelledtask = true;
                    ScriptStatusDesc = new ScriptStatusDesc()
                    {
                        Status = "Failed",
                        statusDescription = "Failed"
                    };
                }
            }
            while (true)
            {
                string message = server.Recv(Encoding.UTF8);
                UpdateTestResults(message);
                server.Send(" ACK", Encoding.UTF8);
                // if (message == "Test Passed")
                //break;
            }
        }
    }
}

为了测试目的,我们根据我们保存在python脚本中的测试消息打破了此代码中的while循环,然后我们能够正确地获取相应站中的输出,但这样我们只能以我们不需要的同步方式运行,因为我们需要并行运行测试站,而while循环不应该因为应该监听响应而中断。

1 个答案:

答案 0 :(得分:0)

我们能够通过获取线索来做一个示例应用来重现问题,并首先知道我们的 ClrZmq模式对我们是否正确并且它是正确的,从而解决了这个问题。我们遵循的决议是,当我们需要将数据绑定到其 ViewModel 中相应的 View 模型对象时,必须使用其中的ID检索特定 TestStation 查看&nbsp; DataContext 类型 ISomeXViewModel < strong> TestStation 我们这样做是因为我们的所有TestStations都是动态添加的,我们甚至将它存储在必要的地方。这个问题是由于UserControls的多个实例造成的,因此我们明确需要手动更新 TestStation

示例代码段

private void BindTestResult(string xmlPayLoad)

{

//将xmlPalLoad转换为类/模型对象

ITestStationViewModel viewModel =(ITestStationViewModel)((IView)DynamicTestStationsGrid.Children [StationNumber] .Content).DataContext;

// IView 类具有DataContext属性,因此我将 ContentControl 内容类型转换为 IView 首先输入 ITestStationViewModel

viewModel.TestStationModel = xmlPayLoadModel;

}

感谢。