Windows服务中托管的WCF服务的异步调用

时间:2009-07-21 11:51:44

标签: wcf debugging windows-services asynchronous-wcf-call

我在Windows服务中托管了一个WCF服务。我有控制台应用程序,我为其添加了WCF服务引用并为其生成了客户端。

我可以对服务进行同步调用,但异步调用似乎不起作用。如果我附加服务器进程,它根本不会命中服务。

client= new ServiceClient();
client.DoSomething();//Works fine

client.DoSomethingAsync()//Doesnot work

这是一个已知问题吗?

4 个答案:

答案 0 :(得分:1)

asynccall可能会在后台启动时启动。所以可能发生的事情是你的异步线程正在消失,因为前台线程已经完成了它的处理。

除非您在进行此调用以等待响应之后有一些逻辑,或者继续在主线程上执行其他工作,否则后台线程可能没有时间在应用程序退出之前创建。

可以通过在异步调用后添加Thread.Sleep来轻松测试。

client.DoSomethingAsync();
Thread.Sleep(1000);

出现这种情况的一个症状是您的服务意外启动/停止,并且Windows会抛出错误。

答案 1 :(得分:0)

生成客户端时,是否勾选了框以指定“生成异步操作”?

答案 2 :(得分:0)

从发布的代码中,我假设您没有设置处理程序来处理来自异步方法的响应。您需要类似 msdn post 底部的示例,您可以使用AddHanlder来处理响应。

在进行异步调用之前,请执行以下操作:

AddHandler client.DoSomethingCompleted, AddressOf DoSomethingCallback

用一种处理外围的方法:

Private Shared Sub DoSomethingCallback(ByVal sender As Object, ByVal e As DoSomethingCompletedEventArgs)

        'Do something with e.Result
        MsgBox e.Result

End Sub

答案 3 :(得分:0)

如果您打电话

client.DoSomethingAsync()//Doesnot work

然后你为回调完成事件指定了一个处理程序??

public event DoSomethingCompletedEventHandler DoSomethingCompleted;

异步调用会发生什么变化,但它会如何向您发回任何结果?你需要为它提供一个处理程序方法 - 将它连接到DoSomethingCompleted事件处理程序!在该方法中,您将获得异步调用的结果,无论您需要做什么,都可以使用它们。

马克