我在Windows服务中托管了一个WCF服务。我有控制台应用程序,我为其添加了WCF服务引用并为其生成了客户端。
我可以对服务进行同步调用,但异步调用似乎不起作用。如果我附加服务器进程,它根本不会命中服务。
client= new ServiceClient();
client.DoSomething();//Works fine
client.DoSomethingAsync()//Doesnot work
这是一个已知问题吗?
答案 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
事件处理程序!在该方法中,您将获得异步调用的结果,无论您需要做什么,都可以使用它们。
马克