此文是本人应用WCF的心得备忘录,只从现象出发,未深入研究机制,此Demo的结论如下:
1)如果服务函数具有返回值(即:IsOneWay = false),那么无论回调函数是否具有返回值,服务函数和回调函数必须在不同的线程中执行,而且服务类必须加上ConcurrencyMode = ConcurrencyMode.Multiple或ReEntrance Attribute, 否则会阻塞 或发生异常
所谓不同的线程,可以在服务函数中另开线程调用回调函数,也可以在客户端中另开线程调用服务函数
代码
ThreadPool.QueueUserWorkItem(new WaitCallback((object state) => {
Form1 frm = (Form1)state;
for (int i = 0; i < 10; i++)
{
using (proxy = new TemperatureClient(new InstanceContext(state)))
{
bool rlt = proxy.TwoWayServerInvokeTwoWayClient();
frm.DisplayResult(rlt);
}
}
}), this);
Form1 frm = (Form1)state;
for (int i = 0; i < 10; i++)
{
using (proxy = new TemperatureClient(new InstanceContext(state)))
{
bool rlt = proxy.TwoWayServerInvokeTwoWayClient();
frm.DisplayResult(rlt);
}
}
}), this);
2)如果服务函数不返回值(即:IsOneWay=true),那么无论回调函数是否有返回值,均能正常运行,而不管ConcurrencyMode如何设置
详见Demo代码:

浙公网安备 33010602011771号