我的wpf应用程序通过通信管道连接到我的传统应用程序。 WPF应用程序允许用户使用界面上的按钮绘制地图上的位置。因此,当用户单击WPF应用程序用户界面上的按钮时,会向传统应用程序发送管道消息,以允许用户绘制地图上的位置。当用户使用鼠标在地图上绘制位置时,使用双向通信管道将坐标发送回wpf应用程序。当我的wpf应用程序收到坐标时,它需要相应地处理和执行工作流程。可能会出现一些错误,所以应用程序可能需要显示错误消息。或者在某些情况下可能需要清除在应用程序主线程中创建的集合。所以有一个完整的代码分支在接收到坐标时被执行。在主线程中处理wpf应用程序中的呼叫
如何将我的WPF应用程序带回到主线程,以便在收到坐标时,可以执行用户操作(如显示消息框等)?
现在我收到异常像“收集是在不同的线程中创建的”。
我知道我可以使用此代码显示在主线程消息或明确集合
Application.Current.Dispatcher.Invoke((Action)(() => { PointsCollection.Clear(); }));
Application.Current.Dispatcher.Invoke((Action)(() => { MessageBox.Show("Error"); }));
但在单元测试中这不会工作,也是我将不得不为此在很多地方。有没有更好的办法?
public void PipeClientMessageReceived(int type, string message)
{
var command = (PipeCommand)type;
switch (command)
{
case PipeCommand.Points:
{
string[] tokens = message.Split(':');
var x = Convert.ToDouble(tokens[0]);
var y = Convert.ToDouble(tokens[1]);
SetSlotCoordinates(new Point2D(x, y));
}
break;
}
}
SetSlotCoordinates方法实际上做所有的工作来处理坐标。我试图把这个调用放在Application.Current.Dispatcher中,但没有成功。
Application.Current.Dispatcher.Invoke((Action)(() => { SetSlotCoordinates(new Point2D(x, y)); }));