在windows服务中托管的WCF服务的异步调用
我在Windows服务中托管了一个WCF服务。我有控制台应用程序,我为其添加了WCF服务引用并为其生成了客户端。在windows服务中托管的WCF服务的异步调用
我可以同步调用服务,但异步调用似乎并没有工作。如果我附加服务器进程它根本没有打到服务。
client= new ServiceClient();
client.DoSomething();//Works fine
client.DoSomethingAsync()//Doesnot work
这是已知的问题吗?
的asynccall可能会在后台的WorkerThread开始。所以可能发生的事情是,你的异步线程正在消失,因为前台线程已经完成它的处理。
除非你有一些逻辑,你拨打这个电话等待效应初探,或继续在你的主线程一些其他工作后,后台线程可以不必让应用程序退出之前创建的时间。
这可以通过异步调用之后加入Thread.sleep代码可以容易地测试。
client.DoSomethingAsync();
Thread.Sleep(1000);
发生这种情况的一个症状是,您的服务意外启动/停止,并且Windows会引发错误。
当您生成的客户端,你打勾的框指定“生成异步操作”?
是的,我可以看到生成的代码 – 2009-07-21 12:13:42
的异步方法,使刚要完全清楚,这是已在服务本身的DoSomething的方法自动生成客户端的DoSomethingAsync方法?您还没有尝试在服务中公开自己的DoSomethingAsync方法? – 2009-07-21 12:18:45
yes..DoSomethingAsync方法在客户端中为服务中的DoSomething方法自动生成 – 2009-07-21 12:54:37
从代码贴出来,我假设你没有设置处理程序来处理来自异步方法的响应。你需要像msdn post底部的例子,你可以使用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
事件处理程序!在这种方法中,您将获得异步调用的结果,无论您需要做什么,都可以使用它们。
马克
谢谢..it添加睡眠后工作 – 2009-07-22 05:01:06
太棒了!很高兴有帮助 – pavsaund 2009-07-24 05:05:51