0

我们正在创建一个 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 循环不应中断,因为它应该正在侦听响应。

4

1 回答 1

0

我们能够通过获取线索来解决问题,该示例应用程序重现该问题,并首先了解我们的ClrZmq 模式对我们来说是否正确,并且它是正确的。我们遵循的解决方案是,当我们需要将该数据绑定到其ViewModel中相应的 View 的 Model对象时,必须使用该TestStation的 Id检索特定TestStation的ISomeXViewModel类型的 View 的DataContext 我们这样做是因为我们所有的 TestStation 都是动态添加的,我们甚至将其存储起来以便在必要时访问。这个问题是由于 UserControls 的多个实例造成的,因此我们明确需要花更多的精力手动更新TestStation 。

示例代码片段

私人无效BindTestResult(字符串xmlPayLoad)

{

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

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

// IView类具有 DataContext 属性,因此我首先将 ContentControl 的 Content 类型转换为IView类型然后再转换为ITestStationViewModel

viewModel.TestStationModel = xmlPayLoadModel;

}

谢谢。

于 2014-08-02T17:16:09.017 回答