我们正在创建一个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循环不应该因为应该监听响应而中断。
答案 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;
}
感谢。