나는이 질문을하기 전에 질문했지만 해결책을 제시하고 질문을 완료하고 다른 질문을 할 것입니다. , 비동기 요청에서 시간 초과 콜백 사용
class Program
{
static void Main(string[] args)
{
// Making a request to a nonexistent domain.
HttpSocket.MakeRequest(new Uri("http://www.google.comhklhlñ"), callbackState =>
{
if (callbackState.Exception != null)
throw callbackState.Exception;
Console.WriteLine(GetResponseText(callbackState.ResponseStream));
});
Thread.Sleep(100000);
}
public static string GetResponseText(Stream responseStream)
{
using (var reader = new StreamReader(responseStream))
{
return reader.ReadToEnd();
}
}
}
일단, 콜백 즉시 도달 실행 :
나는 비동기 WebRequest 수 있도록이 클래스를 사용하고 있습니다 :
class HttpSocket
{
public static void MakeRequest(Uri uri, Action<RequestCallbackState> responseCallback)
{
WebRequest request = WebRequest.Create(uri);
request.Proxy = null;
Task<WebResponse> asyncTask = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
ThreadPool.RegisterWaitForSingleObject((asyncTask as IAsyncResult).AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), request, 1000, true);
asyncTask.ContinueWith(task =>
{
WebResponse response = task.Result;
Stream responseStream = response.GetResponseStream();
responseCallback(new RequestCallbackState(response.GetResponseStream()));
responseStream.Close();
response.Close();
});
}
private static void TimeoutCallback(object state, bool timedOut)
{
Console.WriteLine("Timeout: " + timedOut);
if (timedOut)
{
Console.WriteLine("Timeout");
WebRequest request = (WebRequest)state;
if (state != null)
{
request.Abort();
}
}
}
}
을 그리고 난이 코드로 클래스를 테스트하고 있습니다 "Timeout : false"를 표시하고 더 이상 throw되지 않으므로 시간 초과가 작동하지 않습니다.
이 해결책은 original thread에서 제안되었지만, 알 수 있듯이이 코드는 그를 위해 작동합니다.
내가 뭘 잘못하고있어?
편집 :
class RequestCallbackState
{
public Stream ResponseStream { get; private set; }
public Exception Exception { get; private set; }
public RequestCallbackState(Stream responseStream)
{
ResponseStream = responseStream;
}
public RequestCallbackState(Exception exception)
{
Exception = exception;
}
}
class RequestState
{
public byte[] RequestBytes { get; set; }
public WebRequest Request { get; set; }
public Action<RequestCallbackState> ResponseCallback { get; set; }
}
'RequestCallbackState'란 무엇입니까? – BrokenGlass
콜백이 false로 호출되면 객체가 신호되었음을 의미합니다. –
@BrokenGlass 답변을 주셔서 감사합니다. 나는이 클래스들을 포스트에 추가했다. –