2009-07-21 150 views
1

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

我可以同步调用服务,但异步调用似乎并没有工作。如果我附加服务器进程它根本没有打到服务。

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

client.DoSomethingAsync()//Doesnot work 

这是已知的问题吗?

回答

1

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

除非你有一些逻辑,你拨打这个电话等待效应初探,或继续在你的主线程一些其他工作后,后台线程可以不必让应用程序退出之前创建的时间。

这可以通过异步调用之后加入Thread.sleep代码可以容易地测试。

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

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

+0

谢谢..it添加睡眠后工作 – 2009-07-22 05:01:06

+0

太棒了!很高兴有帮助 – pavsaund 2009-07-24 05:05:51

0

当您生成的客户端,你打勾的框指定“生成异步操作”?

+0

是的,我可以看到生成的代码 – 2009-07-21 12:13:42

+0

的异步方法,使刚要完全清楚,这是已在服务本身的DoSomething的方法自动生成客户端的DoSomethingAsync方法?您还没有尝试在服务中公开自己的DoSomethingAsync方法? – 2009-07-21 12:18:45

+0

yes..DoSomethingAsync方法在客户端中为服务中的DoSomething方法自动生成 – 2009-07-21 12:54:37

0

从代码贴出来,我假设你没有设置处理程序来处理来自异步方法的响应。你需要像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 
0

如果你有

client.DoSomethingAsync()//Doesnot work 
通话

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

public event DoSomethingCompletedEventHandler DoSomethingCompleted; 

会发生什么情况是异步调用会关闭,但它将如何将任何结果发回给您?您需要为此提供一个处理程序方法 - 将其连接到DoSomethingCompleted事件处理程序!在这种方法中,您将获得异步调用的结果,无论您需要做什么,都可以使用它们。

马克

相关问题