Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步使用HttpWebRequest而不阻塞UI线程_C#_Winforms_Asynchronous_Httpwebrequest_Httpwebresponse - Fatal编程技术网

C# 异步使用HttpWebRequest而不阻塞UI线程

C# 异步使用HttpWebRequest而不阻塞UI线程,c#,winforms,asynchronous,httpwebrequest,httpwebresponse,C#,Winforms,Asynchronous,Httpwebrequest,Httpwebresponse,我试图在WinForms应用程序中异步使用HttpWebRequest和httpwebresonase,而不阻塞我的UI线程 我看到这个解释了怎么做。然而,我不能100%确定被接受的答案是正确的。接受的答案是使用BeginGetResponse 根据报告: BeginGetResponse方法需要执行一些同步设置任务 完成(DNS解析、代理检测和TCP套接字连接, 例如)在该方法变为异步之前。因此, 决不能在用户界面(UI)线程上调用此方法 因为这可能需要一些时间,通常是几秒钟 有人能告诉我正确

我试图在WinForms应用程序中异步使用
HttpWebRequest
httpwebresonase
,而不阻塞我的UI线程

我看到这个解释了怎么做。然而,我不能100%确定被接受的答案是正确的。接受的答案是使用
BeginGetResponse

根据报告:

BeginGetResponse方法需要执行一些同步设置任务 完成(DNS解析、代理检测和TCP套接字连接, 例如)在该方法变为异步之前。因此, 决不能在用户界面(UI)线程上调用此方法 因为这可能需要一些时间,通常是几秒钟

有人能告诉我正确的方法吗。下面是我的C#函数,我正试图让它在不阻塞UI线程的情况下“正常”工作:

    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);
    }
私有IDictionary CreateWebRequest(字符串端点、字符串方法、字符串数据、bool addAuthHeader)
{
var req=(HttpWebRequest)WebRequest.Create(端点);
要求方法=方法;
if(addAuthHeader)
{
请求头.Add(HttpRequestHeader.Authorization,“Bearer”+_accessToken.accessToken);
}
如果(!string.IsNullOrEmpty(数据))
{
var utfenc=新的UTF8Encoding();
byte[]buffer=utfenc.GetBytes(数据);
req.ContentLength=缓冲区长度;
req.ContentType=“应用程序/x-www-form-urlencoded”;
使用(Stream strm=req.GetRequestStream())
{
strm.Write(buffer,0,buffer.Length);
strm.Close();
}
}
HttpWebResponse响应=null;
尝试
{
response=(HttpWebResponse)req.GetResponse();
}
捕获(WebE例外)
{
if(_accessToken==null)
{
投掷;
}
var responseError=(HttpWebResponse)e.Response;
if(responseError.StatusCode==HttpStatusCode.Unauthorized)
{
var stackTrace=新的stackTrace();
var q=stackTrace.GetFrame(1.GetMethod().Name;
RefreshAccessCode();
req=(HttpWebRequest)WebRequest.Create(端点);
要求方法=方法;
if(addAuthHeader)
{
请求头.Add(HttpRequestHeader.Authorization,“Bearer”+_accessToken.accessToken);
}
response=(HttpWebResponse)req.GetResponse();
}
}
字符串jsonResponse=null;
if(响应!=null)
使用(Stream=response.GetResponseStream())
{
if(流!=null)
{
使用(变量读取器=新的流读取器(流))
{
jsonResponse=reader.ReadToEnd();
}
}
}
返回反序列化响应(jsonResponse);
}

要使用现有代码,只需添加一个要在UI线程上执行的方法,并在单独的线程上创建web请求。当web请求完成时,调用UI线程上的最终方法。因此,一个简单的版本是:

//do some stuff that wont block the ui thread here
ThreadPool.QueueUserWorkItem((o) => 
{
    IDictionary<string, object> result = 
        CreateWebRequest("lalala", "lol", "butts", true);
    BeginInvoke(OnAsyncWebRequestComplete, result);
}, null);

private void OnAsyncWebRequestComplete(IDictionary<string, object> result)
{
    //do some stuff on the UI thread here
}
//在此处执行一些不会阻塞ui线程的操作
ThreadPool.QueueUserWorkItem((o)=>
{
IDictionary结果=
CreateWebRequest(“lalala”、“lol”、“butts”,true);
BeginInvoke(OnAsyncWebRequestComplete,结果);
},空);
SyncyWebRequestComplete上的私有无效(IDictionary结果)
{
//在这里对UI线程执行一些操作
}

如果你对WebRequest之外的内容持开放态度,我是它的粉丝。它使用System.Threading.Tasks而不是BeginGetResponse()和EndGetResonse()

公共异步任务CreateWebRequest(字符串端点、字符串方法、字符串数据、bool addAuthHeader)
{
WebClient客户端=新的WebClient();
if(addAuthHeader)
{
client.Headers.Add(HttpRequestHeader.Authorization,“Bearer”+_accessToken.accessToken);
}
字节[]缓冲区=空;
如果(!string.IsNullOrEmpty(数据))
{
var utfenc=新的UTF8Encoding();
buffer=utfenc.GetBytes(数据);
}
其他的
{
缓冲区=新字节[0];
}
return wait client.UploadDataTaskAsync(端点、方法、缓冲区)
.ContinueWith((字节)=>
{
字符串jsonResponse=null;
使用(var reader=newstreamreader(newmemoryStream(字节)))
{
jsonResponse=reader.ReadToEnd();
}
返回反序列化响应(jsonResponse);
});
}
}

是@Isak对另一个问题的回答,所以你链接了你要找的东西吗?应该是
新内存流(bytes.Result)
public async Task<Dictionary<string, object>> CreateWebRequest(string endPoint, string method, string data, bool addAuthHeader)
{
    WebClient client = new WebClient();

    if (addAuthHeader)
    {
        client.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + _accessToken.AccessToken);
    }

    byte[] buffer = null;

    if (!string.IsNullOrEmpty(data))
    {
        var utfenc = new UTF8Encoding();
        buffer = utfenc.GetBytes(data);
    }
    else
    {
        buffer = new byte[0];
    }

    return await client.UploadDataTaskAsync(endPoint, method, buffer)
        .ContinueWith((bytes) =>
            {
                string jsonResponse = null;

                using (var reader = new StreamReader(new MemoryStream(bytes)))
                {
                    jsonResponse = reader.ReadToEnd();
                }

                return DeserializeResponse(jsonResponse);
            });
    }
}