HttpWebRequest.BeginGetResponse beachtet keine Timeout-Eigenschaften von HttpWebRequest (Timeout oder ReadWriteTimeout).
Ich habe einige Ansätze gelesen, um die gleichen Ergebnisse zu erhalten, aber ich weiß nicht, ob es der beste Weg, es zu tun ist und wenn ich für einige Anrufe verwenden sollte oder ich kann es innerhalb von Schleifen skalieren (ich tue einen Webcrawler).
Das Wichtigste ist, dass mein Code zunächst nicht asynchron ist, ich brauche nur asynchron, weil meine Methode ein CancellationToken akzeptieren sollte.
Meine Sorge gilt WaitHandles und ThreadPool.RegisterWaitForSingleObject. Es ist nicht ein täglicher Code, dann weiß ich nicht, wenn ich Probleme in der nahen Zukunft haben kann.
private static void HandleCancellation(HttpWebRequest request, IAsyncResult getResponseResult, CancellationToken cancellationToken)
{
using (WaitHandle requestHandle = getResponseResult.AsyncWaitHandle)
{
ThreadPool.RegisterWaitForSingleObject(requestHandle, TimeoutCallback, request, request.Timeout, true);
//If request finish or cancellation is called
WaitHandle.WaitAny(new[] {requestHandle, cancellationToken.WaitHandle});
}
//If cancellation was called
if (cancellationToken.IsCancellationRequested)
{
request.Abort();
cancellationToken.ThrowIfCancellationRequested();
}
}
Aufrufen (wieder nicht asynchron)
IAsyncResult getResponseResult = request.BeginGetResponse(null, null);
HandleCancellation(request, getResponseResult, cancellationToken);
return (HttpWebResponse)request.EndGetResponse(getResponseResult);
Referenz: Besserer Ansatz bei der Verwaltung von mehreren WebRequest