我有一個類「圖像」具有三個屬性:URL,ID,內容。 我有10個這樣的圖像列表。 這是一個silverlight應用程序。並行HttpWebRequests與無擴展
我想創建一個方法:
IObservable<Image> DownloadImages(List<Image> imagesToDownload)
{
//start downloading all images in imagesToDownload
//OnImageDownloaded:
image.Content = webResponse.Content
yield image
}
這種方法開始下載並行所有10張圖像。 然後,每個下載完成時,它會將Image.Content到下載的WebResponse.Content。
結果應該是一個的IObservable流與每個下載的圖像。
我在RX初學者,我覺得我想可以用ForkJoin達到什麼樣的,但是這是在反應擴展DLL的實驗版本,我不想使用。
而且我真的不喜歡下載的回調計數檢測,所有圖像下載完畢後,然後調用onCompleted()。
似乎並沒有被在Rx精神給我。
我也張貼到目前爲止,我什麼編碼的解決方案,雖然我不喜歡我的解決方案,因爲它的長/醜,並使用計數器。
return Observable.Create((IObserver<Attachment> observer) =>
{
int downloadCount = attachmentsToBeDownloaded.Count;
foreach (var attachment in attachmentsToBeDownloaded)
{
Action<Attachment> action = attachmentDDD =>
this.BeginDownloadAttachment2(attachment).Subscribe(imageDownloadWebResponse =>
{
try
{
using (Stream stream = imageDownloadWebResponse.GetResponseStream())
{
attachment.FileContent = stream.ReadToEnd();
}
observer.OnNext(attachmentDDD);
lock (downloadCountLocker)
{
downloadCount--;
if (downloadCount == 0)
{
observer.OnCompleted();
}
}
} catch (Exception ex)
{
observer.OnError(ex);
}
});
action.Invoke(attachment);
}
return() => { }; //do nothing when subscriber disposes subscription
});
}
好吧,我確實管理它,使它的工作最終根據吉姆的答案。
var obs = from image in attachmentsToBeDownloaded.ToObservable()
from webResponse in this.BeginDownloadAttachment2(image).ObserveOn(Scheduler.ThreadPool)
from responseStream in Observable.Using(webResponse.GetResponseStream, Observable.Return)
let newImage = setAttachmentValue(image, responseStream.ReadToEnd())
select newImage;
其中setAttachmentValue只需要`image.Content = bytes;返回圖像;
BeginDownloadAttachment2代碼:
private IObservable<WebResponse> BeginDownloadAttachment2(Attachment attachment)
{
Uri requestUri = new Uri(this.DownloadLinkBaseUrl + attachment.Id.ToString();
WebRequest imageDownloadWebRequest = HttpWebRequest.Create(requestUri);
IObservable<WebResponse> imageDownloadObservable = Observable.FromAsyncPattern<WebResponse>(imageDownloadWebRequest.BeginGetResponse, imageDownloadWebRequest.EndGetResponse)();
return imageDownloadObservable;
}
很高興提供幫助。我不得不說,解決方案看起來比開始的維護容易得多。 –
良好的使用。很好的解決方案。 –