我在 Web 服务中使用第三方资源(.dll),我的问题是,调用此资源(调用方法)是异步完成的 - 我需要订阅一个事件,以获得答案我的请求。我如何在 ac# web 服务中做到这一点?
更新:
关于Sunny 的回答:
我不想让我的网络服务异步。
我在 Web 服务中使用第三方资源(.dll),我的问题是,调用此资源(调用方法)是异步完成的 - 我需要订阅一个事件,以获得答案我的请求。我如何在 ac# web 服务中做到这一点?
更新:
关于Sunny 的回答:
我不想让我的网络服务异步。
假设您的第 3 方组件使用整个 .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 而不是回调来阻止,直到操作完成。
如果第 3 方组件不支持标准异步编程模型(即不使用 IAsyncResult),您仍然可以使用 AutoResetEvent 或 ManualResetEvent 实现同步。为此,请在 Web 服务类中声明 AutoResetEvent 类型的字段:
AutoResetEvent processingCompleteEvent = new AutoResetEvent();
然后在调用 3rd 方组件后等待事件发出信号
// call 3rd party component
processingCompleteEvent.WaitOne()
并在回调事件处理程序中发出信号让等待线程继续执行:
processingCompleteEvent.Set()
来自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);
}
}