在预定的时间间隔内,我需要调用WCF服务异步调用另一个WCF服务。我已经解决了对WCF服务的调度问题。
我认为我需要并且我已经在stackoverflow上阅读了有必要...,(实质上)准备或更改WCF服务的代码,以便能够处理对它们的异步调用。如果是这样,那个简单的例子会是什么样的?(也许是前后的例子)在.Net 3.5中还有必要吗?
第二,我正在使用来自WCF服务的代理来调用下一个WCF服务,并且需要一个对WCF服务的异步调用示例,如果它看起来与使用典型异步示例的BeginEnvoke和EndEnvoke的典型不同
如果我对我的问题完全不感兴趣,我会相信这一点,并希望通过任何更正来建立一个更好的问题。
答案 0 :(得分:22)
在要调用的WCF方法上将OperationContract属性的IsOneWay属性设置为true。这告诉WCF该调用仅对一个方向有用,并且客户端不会因该方法完成执行而停留。
即使在调用BeginInvoke时,您的客户端代码仍然会挂起,等待服务器方法完成执行,但它会在线程池线程上执行。
[ServiceContract]
interface IWCFContract
{
[OperationContract(IsOneWay = true)]
void CallMe()
}
执行所需操作的另一种方法是让WCF服务将其工作分配到后台线程并立即返回。
答案 1 :(得分:7)
请务必仔细测试OneWay WCF呼叫的执行方式。当你达到X个同时呼叫时,我已经看到它停止了,好像WCF确实等待呼叫结束。
更安全的解决方案是尽快让“目标”代码返回控制:不要让它完全处理调用,而是让它只将数据放入队列并返回。让另一个线程轮询队列并异步处理数据。
并确保应用线程安全机制以避免在该队列上工作的两个线程之间发生冲突。
答案 2 :(得分:0)
不要使用BeginInvoke甚至是模式的线程。确保根据Microsoft网站使用AsyncPattern装饰您的类,否则您的Async委托和线程将以同步模式运行。 WCF强制此行为。这个信息是由另一个op发布的,他发现了阻止回调问题的解决方案。抱歉,但我不记得链接了。