我在 Windows 服务中托管了 WCF 服务。我有控制台应用程序,我为其添加了 WCF 服务引用并为其生成了客户端。
我可以对服务进行同步调用,但异步调用似乎不起作用。如果我附加服务器进程,它根本不会影响服务。
client= new ServiceClient();
client.DoSomething();//Works fine
client.DoSomethingAsync()//Doesnot work
这是一个已知问题吗?
我在 Windows 服务中托管了 WCF 服务。我有控制台应用程序,我为其添加了 WCF 服务引用并为其生成了客户端。
我可以对服务进行同步调用,但异步调用似乎不起作用。如果我附加服务器进程,它根本不会影响服务。
client= new ServiceClient();
client.DoSomething();//Works fine
client.DoSomethingAsync()//Doesnot work
这是一个已知问题吗?
异步调用可能会在后台工作线程中启动。所以可能发生的是你的异步线程正在消亡,因为前台线程已经完成了它的处理。
除非您在进行此调用以等待响应后有一些逻辑,或者在主线程上继续进行其他一些工作,否则后台线程可能没有时间在应用程序退出之前创建。
这可以通过在异步调用之后添加 Thread.Sleep 来轻松测试。
client.DoSomethingAsync();
Thread.Sleep(1000);
发生这种情况的一个症状是您的服务意外启动/停止并且 Windows 抛出错误。
当您生成客户端时,您是否勾选了指定“生成异步操作”的框?
从发布的代码中,我假设您没有设置处理程序来处理来自异步方法的响应。您将需要类似于此msdn 帖子底部示例的内容,您可以在其中使用 AddHanlder 来处理响应。
在进行异步调用之前,如下所示:
AddHandler client.DoSomethingCompleted, AddressOf DoSomethingCallback
用一种方法来处理outome:
Private Shared Sub DoSomethingCallback(ByVal sender As Object, ByVal e As DoSomethingCompletedEventArgs)
'Do something with e.Result
MsgBox e.Result
End Sub
如果你有一个电话
client.DoSomethingAsync()//Doesnot work
那么你是否为回调完成事件指定了一个处理程序?
public event DoSomethingCompletedEventHandler DoSomethingCompleted;
发生的情况是异步调用关闭了,但它如何将任何结果发回给您?您需要为此提供一个处理程序方法 - 将其连接到DoSomethingCompleted
事件处理程序!在该方法中,您将获得异步调用的结果,您可以使用它们做任何您需要做的事情。
马克