1

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

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

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

client.DoSomethingAsync()//Doesnot work

这是一个已知问题吗?

4

4 回答 4

1

异步调用可能会在后台工作线程中启动。所以可能发生的是你的异步线程正在消亡,因为前台线程已经完成了它的处理。

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

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

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

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

于 2009-07-21T12:17:49.600 回答
0

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

于 2009-07-21T11:56:19.773 回答
0

从发布的代码中,我假设您没有设置处理程序来处理来自异步方法的响应。您将需要类似于此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
于 2009-07-21T14:39:25.910 回答
0

如果你有一个电话

client.DoSomethingAsync()//Doesnot work

那么你是否为回调完成事件指定了一个处理程序?

public event DoSomethingCompletedEventHandler DoSomethingCompleted;

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

马克

于 2009-07-21T15:50:10.053 回答