在 C# Web 服务中调用异步调用

Invoking asynchronous call in a C# web service

提问人: 提问时间:10/29/2008 最后编辑:Community 更新时间:1/29/2011 访问量:21577

问:

我在 Web 服务中使用第三方资源(.dll),我的问题是,调用此资源(调用方法)是异步完成的 - 我需要订阅一个事件,以获得我的请求的答案。如何在 c# Web 服务中执行此操作?

更新:

关于Sunny的回答

我不想使我的 Web 服务异步。

C# Web 服务 异步 函数调用

评论

0赞 Travis Illig 10/30/2008
你能提供一个代码片段来显示你在说什么吗?对于你所拥有的东西、当前异步的东西以及你想要实现的目标,似乎存在一些困惑。

答:

0赞 Sunny Milenov 10/29/2008 #1

来自 MSDN 文档

using System;
using System.Web.Services;

[WebService(Namespace="http://www.contoso.com/")]
public class MyService : WebService {
  public RemoteService remoteService;
  public MyService() {
     // Create a new instance of proxy class for 
     // the XML Web service to be called.
     remoteService = new RemoteService();
  }
  // Define the Begin method.
  [WebMethod]
  public IAsyncResult BeginGetAuthorRoyalties(String Author,
                  AsyncCallback callback, object asyncState) {
     // Begin asynchronous communictation with a different XML Web
     // service.
     return remoteService.BeginReturnedStronglyTypedDS(Author,
                         callback,asyncState);
  }
  // Define the End method.
  [WebMethod]
  public AuthorRoyalties EndGetAuthorRoyalties(IAsyncResult
                                   asyncResult) {
   // Return the asynchronous result from the other XML Web service.
   return remoteService.EndReturnedStronglyTypedDS(asyncResult);
  }
}
2赞 Dan Finucane 10/30/2008 #2

假设第三方组件使用的是整个 .NET Framework 中使用的异步编程模型模式,则可以执行如下操作

    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.stackoverflow.com");
    IAsyncResult asyncResult = httpWebRequest.BeginGetResponse(null, null);

    asyncResult.AsyncWaitHandle.WaitOne();

    using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult))
    using (StreamReader responseStreamReader = new StreamReader(httpWebResponse.GetResponseStream()))
    {
        string responseText = responseStreamReader.ReadToEnd();
    }

由于需要阻止 Web 服务操作,因此应使用 IAsyncResult.AsyncWaitHandle 而不是回调来阻止操作,直到操作完成。

评论

0赞 Adrian Clark 10/30/2008
包含更多信息和另一个示例的 MSDN 链接:msdn.microsoft.com/en-us/library/ms228962.aspx
1赞 csgero 10/30/2008 #3

如果第三方组件不支持标准异步编程模型(即它不使用 IAsyncResult),您仍然可以使用 AutoResetEvent 或 ManualResetEvent 实现同步。为此,请在 Web 服务类中声明 AutoResetEvent 类型的字段:

AutoResetEvent processingCompleteEvent = new AutoResetEvent();

然后在调用第三方组件后等待事件发出信号

// call 3rd party component
processingCompleteEvent.WaitOne()

并在回调事件处理程序中向事件发出信号,让等待的线程继续执行:

 processingCompleteEvent.Set()