Web ページで、タイムアウトをプログラムで設定することを許可していないサード パーティに電話しています。BeginInvoke を呼び出し、AsyncWaitHandle.WaitOne を使用して、指定された時間待機します。
呼び出しがタイムアウトした場合は、先に進み、開始したスレッド呼び出しを忘れます。私の質問は、タイムアウトの状況で何らかの方法で EndInvoke を呼び出す必要があるかどうかです。この MSDN ページの "CAUTION" 発言は、私がすべきかどうか疑問に思います: http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
私がすべきだと思うなら、次の質問は、私の Web ページの処理が完了し、サード パーティが戻ってくる前にクライアントに戻る場合、コードを実行するためにコールバック メソッドがリッスンするかどうかです。リクエスト/レスポンスが完了すると、サーバーはアクティビティの検索を停止しませんか?
私が使用しているコードは次のとおりです。
public class RemotePaymentProcessor
{
private delegate string SendProcessPaymentDelegate(string creditCardNumber);
private string SendProcessPayment(string creditCardNumber)
{
string response = string.Empty;
// call web service
SlowResponseService.SlowResponseService srs = new WebServiceTimeout.SlowResponseService.SlowResponseService();
response = srs.GetSlowResponse(creditCardNumber);
return response;
}
public string ProcessPayment(string creditCardNumber, int timeoutMilliseconds)
{
string response = string.Empty;
SendProcessPaymentDelegate sppd = new SendProcessPaymentDelegate(SendProcessPayment);
IAsyncResult ar = sppd.BeginInvoke(creditCardNumber, null, new object());
if (!ar.AsyncWaitHandle.WaitOne(timeoutMilliseconds, false))
{
// Async call did not return before timeout
response = "TIMEOUT";
}
else
{
// Async call has returned - get response
response = sppd.EndInvoke(ar);
}
return response;
}
}