c# - HttpRequest 将参数传递给 AsyncCallback 委托(delegate)

标签 c#

我正在异步使用 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/

相关文章:

c# - stdcall 调用约定和在 C# 中使用 pinvoke

c# - Kendo 网格导出到 Excel 货币格式

c# - 如何访问Access json正文/内容(IActionResult)

c# - Entity Framework 和 lambda 表达式树(深度空合并)

c# - 对应于您的 mariadb 服务器版本,以便在 '@gmail.com' 附近使用正确的语法

C# 在处理 Stream 的对象时使用 Statement

c# - 如何获取路径文件夹浏览器对话框

c# - 获取上次备份事件目录的时间

c# - 您可以在自己的初始化行中使用变量(字典中的 tryGetOrElse)吗?

c# - Entity Framework 4 从实体集合中删除对象