Web サービスでサードパーティのリソース (.dll) を使用しています。私の問題は、このリソースの呼び出し (メソッドの呼び出し) が非同期で行われることです。答えを得るには、イベントにサブスクライブする必要があります。私の要求。ac# Web サービスでそれを行うにはどうすればよいですか?
アップデート:
サニーの答えに関して:
Web サービスを非同期にしたくありません。
Web サービスでサードパーティのリソース (.dll) を使用しています。私の問題は、このリソースの呼び出し (メソッドの呼び出し) が非同期で行われることです。答えを得るには、イベントにサブスクライブする必要があります。私の要求。ac# Web サービスでそれを行うにはどうすればよいですか?
アップデート:
サニーの答えに関して:
Web サービスを非同期にしたくありません。
サード パーティ コンポーネントが .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 を使用して、操作が完了するまでブロックする必要があります。
サードパーティ コンポーネントが標準の非同期プログラミング モデルをサポートしていない (つまり、IAsyncResult を使用していない) 場合でも、AutoResetEvent または ManualResetEvent を使用して同期を行うことができます。これを行うには、Web サービス クラスで AutoResetEvent タイプのフィールドを宣言します。
AutoResetEvent processingCompleteEvent = new AutoResetEvent();
次に、サードパーティのコンポーネントを呼び出した後、イベントが通知されるのを待ちます
// 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);
}
}