我試圖在WinForms應用程序中異步使用HttpWebRequest
和HttpWebResonse
而不會阻塞我的UI線程。異步使用HttpWebRequest而不阻塞UI線程
我看到這個similar SO Question,它解釋瞭如何做到這一點。但是,我不能100%確定接受的答案是正確的做法。接受的答案是使用BeginGetResponse
。
的BeginGetResponse方法需要一些同步設置任務給 完成(DNS解析,代理檢測,並且TCP套接字連接, 例如)之前該方法變得異步的。因此,不應在用戶界面(UI)線程 上調用此方法,因爲它可能需要一些時間(通常爲幾秒)。
有人可以請我提供正確的方法來做到這一點。這裏是我的,我試圖做工作「正常」,而不擋住了我的UI線程C#功能:
private IDictionary<string, object> CreateWebRequest(string endPoint, string method, string data, bool addAuthHeader)
{
var req = (HttpWebRequest)WebRequest.Create(endPoint);
req.Method = method;
if (addAuthHeader)
{
req.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + _accessToken.AccessToken);
}
if (!string.IsNullOrEmpty(data))
{
var utfenc = new UTF8Encoding();
byte[] buffer = utfenc.GetBytes(data);
req.ContentLength = buffer.Length;
req.ContentType = "application/x-www-form-urlencoded";
using (Stream strm = req.GetRequestStream())
{
strm.Write(buffer, 0, buffer.Length);
strm.Close();
}
}
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)req.GetResponse();
}
catch (WebException e)
{
if (_accessToken == null)
{
throw;
}
var responseError = (HttpWebResponse)e.Response;
if (responseError.StatusCode == HttpStatusCode.Unauthorized)
{
var stackTrace = new StackTrace();
var q = stackTrace.GetFrame(1).GetMethod().Name;
RefreshAccessCode();
req = (HttpWebRequest)WebRequest.Create(endPoint);
req.Method = method;
if (addAuthHeader)
{
req.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + _accessToken.AccessToken);
}
response = (HttpWebResponse)req.GetResponse();
}
}
string jsonResponse = null;
if (response != null)
using (Stream stream = response.GetResponseStream())
{
if (stream != null)
{
using (var reader = new StreamReader(stream))
{
jsonResponse = reader.ReadToEnd();
}
}
}
return DeserializeResponse(jsonResponse);
}
是不是@ Isak對另一個問題的回答你鏈接了你要找的東西? – vlad 2013-02-26 21:14:05