我正在异步使用 HttpWebRequest
类,如下所示(它是一个 Windows 应用程序)
private void StartWebRequest(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.BeginGetResponse(new AsyncCallback(FinishWebRequest), request);
}
private void FinishWebRequest(IAsyncResult result)
{
HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
int num = 100000;
byte[] buffer = new byte[num];
int offset = 0;
while ((num2 = responseStream.Read(buffer, offset, 1000)) != 0)
{
offset += num2;
}
MemoryStream stream = new MemoryStream(buffer, 0, offset);
Bitmap bitmap = (Bitmap)Image.FromStream(stream);
bitmap.Save(@"z:\new.jpg");
response.Close();
responseStream.Close();
stream.Close();
}
但是我想从 StartWebRequest
方法向 AsyncCallback
委托(delegate)提供一些参数,这可能吗?因为我想将图片名称作为参数,例如:
bitmap.Save(@"z:\MYPARAMATERVALUE.jpg");
最佳答案
这里最简单的方法是使用匿名函数(匿名方法或 lambda 表达式),如下所示:
private void StartWebRequest(string url, string filename)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.BeginGetResponse(result => {
FinishWebRequest(result, request, filename);
}, null); // Don't need the state here any more
}
private void FinishWebRequest(IAsyncResult result,
HttpWebRequest request,
string filename)
{
using (HttpWebResponse response =
(HttpWebResponse) request.EndGetResponse(result))
{
// Use filename here
}
}
当然,您可以手动完成所有这些操作,但您需要创建一个新类来捕获文件名,创建该类的实例,然后使用该类中的方法作为回调委托(delegate)。这正是编译器通过匿名函数为您所做的事情。
关于c# - HttpRequest 将参数传递给 AsyncCallback 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8642745/