Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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# 如何进行asyc并等待WebRequest?_C#_Async Await_Webrequest - Fatal编程技术网

C# 如何进行asyc并等待WebRequest?

C# 如何进行asyc并等待WebRequest?,c#,async-await,webrequest,C#,Async Await,Webrequest,我这里有这个代码。它从imgur获取图像,并设置图片盒 代码: private async void getImage(string imgUrl) { var request = WebRequest.Create(imgUrl); using (var testing = request.GetResponse()) { using (var str = testing

我这里有这个代码。它从imgur获取图像,并设置
图片盒

代码:

private async void getImage(string imgUrl)
        {
            var  request = WebRequest.Create(imgUrl);
            using (var testing = request.GetResponse())
            {
                using (var str =  testing.GetResponseStream())
                {
                    addTablePic.Image = Image.FromStream(str);
                }
            }
        }
答案(已编辑) 我找到了其中一个答案


我的问题是如何在
WebRequest
上实现
async
wait

下面的示例代码演示了如何对WebRequest类使用异步调用。该示例是一个控制台程序,它从命令行获取URI,在URI处请求资源,然后在从Internet接收数据时将数据打印到控制台

private async Task getImage(string imgUrl)
    {
        var  request = WebRequest.Create(imgUrl);
        using (var testing = await request.GetResponseAsync())
        {
            using (var str =  testing.GetResponseStream())
            {
                addTablePic.Image = Image.FromStream(str);
            }
        }
    }
该程序定义了两个类供自己使用,一个是RequestState类,它通过异步调用传递数据,另一个是ClientGetAsync类,它实现对Internet资源的异步请求

RequestState类在调用为请求提供服务的异步方法时保留请求的状态

ClientGetAsync类实现对Internet资源的异步请求,并将结果响应写入控制台

使用系统;
Net系统;
使用系统线程;
使用系统文本;
使用System.IO;
//RequestState类通过异步调用传递数据。
公共类请求状态
{  
const int BufferSize=1024;
公共数据;
公共字节[]缓冲读取;
公共网络请求;
公共流响应团队;
//为适当的编码类型创建解码器。
公共解码器StreamDecode=Encoding.UTF8.GetDecoder();
公共请求状态()
{  
BufferRead=新字节[BufferSize];
RequestData=新的StringBuilder(String.Empty);
请求=null;
ResponseStream=null;
}       
}  
//ClientGetAsync发出异步请求。
类ClientGetAsync
{  
public static ManualResetEvent allDone=新的ManualResetEvent(false);
const int BUFFER_SIZE=1024;
公共静态void Main(字符串[]args)
{  
如果(参数长度<1)
{  
showusage();
返回;
}  
//从命令行获取URI。
Uri httpSite=新Uri(args[0]);
//创建请求对象。
WebRequest wreq=WebRequest.Create(httpSite);
//创建状态对象。
RequestState rs=新的RequestState();
//将请求放入状态对象中,以便可以传递。
rs.请求=wreq;
//发出异步请求。
IAsyncResult r=(IAsyncResult)wreq.BeginGetResponse(
新异步回调(RespCallback,rs);
//等待ManualReset事件设置,以便应用程序
//直到调用回调后才退出。
全部完成。WaitOne();
Console.WriteLine(rs.RequestData.ToString());
}  
公共静态void showusage(){
WriteLine(“尝试获取URL”);
Console.WriteLine(“\r\n用法:”);
WriteLine(“ClientGetAsync URL”);
Console.WriteLine(“示例:”);
WriteLine(“ClientGetAsync someurl”);
}  
专用静态无效响应回调(IAsyncResult ar)
{  
//从异步结果中获取RequestState对象。
RequestState rs=(RequestState)ar.AsyncState;
//从RequestState获取WebRequest。
WebRequest req=rs.请求;
//调用EndGetResponse,它生成WebResponse对象
//这来自于上面发出的请求。
WebResponse resp=请求EndGetResponse(ar);
//开始从响应流读取数据。
Stream ResponseStream=resp.GetResponseStream();
//将响应流存储在RequestState中以进行读取
//该流是异步的。
rs.ResponseStream=ResponseStream;
//将rs.BufferRead传递给BeginRead。将数据读入rs.BufferRead
IAsyncResult iarRead=ResponseStream.BeginRead(rs.BufferRead,0,
缓冲区大小,新异步回调(ReadCallBack),rs;
}  
私有静态void ReadCallBack(IAsyncResult asyncResult)
{  
//从AsyncResult获取RequestState对象。
RequestState rs=(RequestState)asyncResult.AsyncState;
//检索RespCallback中设置的ResponseStream。
Stream responseStream=rs.responseStream;
//读取rs.BufferRead以验证它是否包含数据。
int read=responseStream.EndRead(异步结果);
如果(读取>0)
{  
//准备用于转换为Unicode的字符数组缓冲区。
Char[]charBuffer=新字符[BUFFER_SIZE];
//将字节流转换为字符数组,然后转换为字符串。
//len包含转换为Unicode的字符数。
整数长度=
GetChars(rs.BufferRead,0,read,charBuffer,0);
String str=新字符串(charBuffer,0,len);
//将最近读取的数据附加到RequestData stringbuilder
//对象包含在RequestState中。
rs.RequestData.Append(
Encoding.ASCII.GetString(rs.BufferRead,0,read));
//继续读取数据,直到
//responseStream.EndRead返回–1。
IAsyncResult ar=响应团队开始(
rs.BufferRead,0,缓冲区大小,
新的异步回调(ReadCallBack),rs);
}  
其他的
{  
如果(rs.RequestData.Length>0)
{  
//向控制台显示数据。
字符串结构内容;
strContent=rs.RequestData.ToString();
}  
//关闭响应流。
responseStream.Close();
//设置ManualReset事件,以便主螺纹可以退出。
allDone.Set();
}  
返回;
}      
}
private async Task getImage(string imgUrl)
    {
        var  request = WebRequest.Create(imgUrl);
        using (var testing = await request.GetResponseAsync())
        {
            using (var str =  testing.GetResponseStream())
            {
                addTablePic.Image = Image.FromStream(str);
            }
        }
    }
    HttpWebRequest webRequest;
    void StartWebRequest(string imgUrl)
    {
        webRequest = WebRequest.CreateHttp(imgUrl);
        webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
    }

    void FinishWebRequest(IAsyncResult result)
    {
        HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
        Task.Run(() =>
        {
            using (var str = response)
            {
                addTablePic.BeginInvoke((MethodInvoker)delegate () { addTablePic.Image = Image.FromStream(str); });
            }
        });
    }