c# jsp 호출 - HttpWebRequest (.NET)를 비동기 적으로 사용하는 방법?





4 Answers

답을 생각해보십시오.

HttpWebRequest webRequest;

void StartWebRequest()
{
    webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
}

void FinishWebRequest(IAsyncResult result)
{
    webRequest.EndGetResponse(result);
}

요청 포인터 나 다음과 같은 다른 객체를 보낼 수 있습니다.

void StartWebRequest()
{
    HttpWebRequest webRequest = ...;
    webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), webRequest);
}

void FinishWebRequest(IAsyncResult result)
{
    HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
}

인사말

post 전송 4.0

HttpWebRequest (.NET, C #)를 비동기 적으로 사용하려면 어떻게해야합니까?




지금까지 가장 쉬운 방법은 TPL TaskFactory.FromAsync 를 사용하는 것입니다. 새로운 async/await 키워드와 함께 사용할 때 문자 그대로 두 줄의 코드입니다.

var request = WebRequest.Create("http://www..com");
var response = (HttpWebResponse) await Task.Factory
    .FromAsync<WebResponse>(request.BeginGetResponse,
                            request.EndGetResponse,
                            null);
Debug.Assert(response.StatusCode == HttpStatusCode.OK);

C # 5 컴파일러를 사용할 수없는 경우 위의 작업은 Task.ContinueWith 메서드를 사용하여 수행 할 수 있습니다.

Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse,
                                    request.EndGetResponse,
                                    null)
    .ContinueWith(task =>
    {
        var response = (HttpWebResponse) task.Result;
        Debug.Assert(response.StatusCode == HttpStatusCode.OK);
    });



이 답변 중 많은 수가 게시되었으므로 .NET이 변경되었으며 더 최신 답변을 제공해 드리고자합니다. 비동기 메서드를 사용하여 백그라운드 스레드에서 실행할 Task 을 시작합니다.

private async Task<String> MakeRequestAsync(String url)
{    
    String responseText = await Task.Run(() =>
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            WebResponse response = request.GetResponse();            
            Stream responseStream = response.GetResponseStream();
            return new StreamReader(responseStream).ReadToEnd();            
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
        return null;
    });

    return responseText;
}

비동기 메서드를 사용하려면 :

String response = await MakeRequestAsync("http://example.com/");

최신 정보:

이 솔루션은 WebRequest.GetResponseAsync() 대신 WebRequest.GetResponseAsync() 를 사용하는 UWP 응용 프로그램에서는 작동하지 않으며 적절할 경우 Dispose() 메서드를 호출하지 않습니다. @dragansr은 이러한 문제를 해결하는 훌륭한 대체 솔루션을 제공합니다.




public static async Task<byte[]> GetBytesAsync(string url) {
    var request = (HttpWebRequest)WebRequest.Create(url);
    using (var response = await request.GetResponseAsync())
    using (var content = new MemoryStream())
    using (var responseStream = response.GetResponseStream()) {
        await responseStream.CopyToAsync(content);
        return content.ToArray();
    }
}

public static async Task<string> GetStringAsync(string url) {
    var bytes = await GetBytesAsync(url);
    return Encoding.UTF8.GetString(bytes, 0, bytes.Length);
}



Related