Far*_*raz 5 c# wpf wcf multithreading
我编写WCF代码并托管在WPF应用程序中。我编写了类来切换我的MainWindow以显示项目中的其他页面
public static class Switcher
{
public static MainWindow pageSwitcher;
public static void Switch(Page newPage)
{
pageSwitcher.Navigate(newPage);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样写我的WCF服务:
[ServiceContract]
public interface IAppManager
{
[OperationContract]
void DoWork();
[OperationContract]
void Page1();
[OperationContract]
void Page2();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class AppManager : IAppManager
{
public void DoWork()
{
}
public void Page1()
{
MainWindow.pageSwitcher = new MainWindow();
MainWindow.Switch(new Page1());
}
public void Page2()
{
MainWindow.pageSwitcher = new MainWindow();
MainWindow.Switch(new Page2());
}
}
Run Code Online (Sandbox Code Playgroud)
我想从另一台装有WCF的计算机上远程更改页面,但它不起作用,我跟踪了wcf的运行和响应代码,但不执行任何操作,如何访问主线程来更改ui页面或其他元素?
您当前的解决方案很不寻常,但 WCF 可以托管在 WPF 应用程序中。但是,您永远不应该尝试直接从 WCF 服务操作 UI - 首先您将遇到跨线程问题。
\n\n您应该考虑做的是通过 pub-sub 代理使用消息传递(图片链接自 MSDN):
\n\n
Prism 的 EventAggregator非常适合这个要求。我精心挑选的几个示例是Simplifying PRISM\xe2\x80\x99s EventAggregator和Prism EventAggregator Sample。
\n\n使用它的方式是服务注册事件然后引发它们,WPF 订阅这些事件并处理它们。这样您还可以指定是在 UI 线程还是后台线程上接收事件。
\n