如何通过WebClient请求传递信息以识别加载的对象?

Edw*_*uay 5 c# silverlight events webclient

我有一个名为DataItems的自定义对象集合,其中包含我想要加载的图像的 URI,并放入我的Silverlight应用程序要使用的集合中.

当我处理每个DataItem时,我得到它的SourceUri(例如" http://..../picture001.png ")并开始加载:

void LoadNext()
{
    WebClient webClientImgDownloader = new WebClient();
    if (loadedItemIndex < RegisteredDataEntries.Count())
    {
        DataItem dataItem = RegisteredDataEntries[registeredIdCodes[loadedItemIndex]];
        if (dataItem.Kind == DataItemKind.Image)
        {
            webClientImgDownloader.OpenReadCompleted += 
                new OpenReadCompletedEventHandler(webClientImgDownloader_OpenReadCompleted);
            webClientImgDownloader.OpenReadAsync(new Uri(dataItem.SourceUri, 
                UriKind.Absolute));
            webClientImgDownloader.AddObject(dataItem); //????????????????????
            webClientImgDownloader.Headers["idCode"] = dataItem.IdCode; //?????????????
            webClientImgDownloader.ResponseHeaders["idCode"] = dataItem.IdCode; //?????????????
        }
    }
    else
    {
        OnLoadingComplete(this, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当该图像的加载完成后,我将图像保存在一个集合中:

void webClientImgDownloader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    dataItemIdCode = e.DataItem.IdCode; //???????????????????
    dataitemIdCode = ((DataItem)sender).IdCode; //?????????????????????

    BitmapImage bitmap = new BitmapImage();
    bitmap.SetSource(e.Result);

    Image image = new Image();
    image.Source = bitmap;
    Images.Add(dataItemIdCode, image);
}
Run Code Online (Sandbox Code Playgroud)

但是,如何将当前DataItem的IdCode传递给我的OpenReadCompleted方法,以便在该图像完成加载后,我还可以根据其IdCode识别它?

回答:

弗朗西的建议是有效的,这里有其他人寻找这条线的路线::

webClientImgDownloader.OpenReadAsync(new Uri(dataItem.SourceUri, 
    UriKind.Absolute), dataItem);
...
DataItem dataItem = e.UserState as DataItem;
Run Code Online (Sandbox Code Playgroud)

Fra*_*nov 6

有一个OpenDataAsync带有用户令牌对象的重载.您应该OpenReadCompletedEventArgsUserState属性(继承自AsyncCompletedEventArgs)中获取此对象.