我正在编写一个需要"双重"UI的程序:第一个是经典的Windows表单,第二个是通过Windows Phone设备。我正在使用 WCF(异步,此设备的唯一可能性),但我的行为对我来说似乎很奇怪。好吧,我对 WCF 非常基本,所以也许我做错了什么。我编写了更简单版本的 WCF 服务器代码,因此此处的问题更清楚:
[ServiceContract]
public partial class Form2 : Form
{
int x = 0;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
prova1();
}
private void button2_Click(object sender, EventArgs e)
{
x++;
}
[OperationContract]
void prova1()
{
MessageBox.Show("x = " + x.ToString());
}
如果我单击按钮 2,然后单击按钮 1,我显然会得到一个带有"x = 1"的弹出框。但是如果我通过Windows Phone应用程序调用prova1(),我总是会得到"x = 0"。这是一种非常常规的行为:如果我在 WCF 服务器的代码中实例化一个对象,并尝试在 WCF 服务器的方法(通过外部设备调用)中使用它,我将得到一个 null 引用异常。似乎我在 WCF 服务器代码中所做的一切都在称为槽式 WCF 的方法中完全不可见。有没有办法避免这种行为?
当您从类本身调用prova1
时,您是在 Windows 窗体中的程序上下文中工作。这将使您可以使用MessageBox
静态方法,您可以获取Show
方法来显示弹出窗口。
但是,当您从WP7进行服务器调用时,您是从完全不同的应用程序上下文访问该类的,因此即使MethodBox.Show
工作正常,它也会在服务器上显示消息框,而不是在手机上。但是 WCF 不会准备在应用程序上下文中运行的类,并且整个 Show
方法将失败。
因此,您将涉及 WP7 和托管 WCF 服务的服务器/客户端方案与 Windows 窗体应用的单个程序上下文混淆了。