【问题标题】:Need to pass additional parameter to event handler while using DownloadDataCompleted method使用 DownloadDataCompleted 方法时需要将附加参数传递给事件处理程序
【发布时间】:2015-06-03 14:48:41
【问题描述】:

我需要使用WebClient.DownloadDataAsync Method实现异步下载

我定义的事件处理程序如下:

 Private Sub DownloadCompleted(sender As Object, e As DownloadDataCompletedEventArgs)
        Dim bytes() As Byte = e.Result
        'do somthing with result
    End Sub

但是我需要向这个事件处理程序传递一个附加参数以及下载的结果,我使用它创建 URI 的值。例如:

Dim pictureURI = "http://images.server.sample.com/" + myUniqueUserIdentifier

我需要在DownloadCompleted sub 回调时获得myUniqueUserIdentifier。

我正在使用以下代码注册我的事件处理程序:

AddHandler webClient.DownloadDataCompleted, AddressOf DownloadCompleted

我只有一个猜测,扩展WebClient 对象并覆盖DownloadDataCompleted 对象。但在执行此操作之前,我想检查一下是否有更简单的解决方案?

谢谢。

【问题讨论】:

  • 请将标题修改为有意义且与问题相关的内容,这将有助于未来的访问者......我们不需要标题中的标签
  • 对不起,我已经修好了...
  • @Anatoly:你能把它附加到sender吗?
  • @huMptyduMpty,我不知道。我来自 Java 世界,只是在需要修复一些遗留代码时偶尔接触 vb.net。我正在寻找我应该在哪里移动的任何方向或如何做的简单示例。谢谢。

标签: vb.net webclient


【解决方案1】:

您可以使用WebClient.DownloadDataAsync 重载,它接受一个额外的对象,然后通过AsyncCompletedEventArgs.UserState 属性再次接收它。

这是一个例子:

Sub Main
    Dim url = "http://google.com"
    Dim client = new WebClient()
    AddHandler client.DownloadDataCompleted, AddressOf DownloadDataCompleted
    client.DownloadDataAsync(new Uri(url), url) ' <- pass url as additional information...'
End Sub

Sub DownloadDataCompleted(sender as object, e as DownloadDataCompletedEventArgs)
    Dim raw as byte() = e.Result
    ' ... and recieve it in the event handler via the UserState property'
    Console.WriteLine(raw.Length & " bytes received from " & e.UserState.ToString())
End Sub

【讨论】:

    【解决方案2】:

    你可以使用函数来传递参数而不是AddressOf

    AddHandler webClient.DownloadDataCompleted, Function(sender, e) DownloadCompleted(param) 
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 2013-08-16
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      相关资源
      最近更新 更多