C# 如何进行asyc并等待WebRequest?
我这里有这个代码。它从imgur获取图像,并设置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
图片盒
代码:
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); });
}
});
}