Трудно понять, к чему вы стремитесь (я думаю, что вы пытались придумать код для публикации в StackOverflow и многое потеряли в переводе), но я думаю, что я мало что могу изменить по этому поводу.
Одна вещь, которую я заметил, это то, что вы анализируете результат обратно в главном потоке. Есть причины, по которым вы могли бы сделать это, но вы могли бы рассмотреть это:
//Note the void here. Is your intention to return a new collection or contribute
//to an existing one? I assumed the latter and changed the method to be more clear
//that this method causes side effects.
public void GetData(string url, ObservableCollection<Data> targetCollection)
{
var result = Observable
.FromEventPattern<OpenReadCompletedEventHandler, OpenReadCompletedEventArgs>
(
ev => webClient.OpenReadCompleted += ev,
ev => webClient.OpenReadCompleted -= ev
)
.Select(o => ParseCSV(o.EventArgs.Result));
result.Subscribe(targetCollection.Add);
webClient.OpenReadAsync(new Uri(url));
}
//This method now returns a Data object read from a Stream
private static Data ParseCSV(Stream stream)
{
try
{
using (StreamReader reader = new StreamReader(stream))
{
string contents = reader.ReadToEnd();
//...
return data;
}
}
catch (Exception ex)
{
//Use Exception.ToString(). You get error and stack trace information
//For this error as well as any inner exceptions. Nice!
System.Diagnostics.Debug.WriteLine("Unable to get history data!\n" + ex.ToString());
}
return null;
}
Здесь для каждого значения, которое возвращается из запроса webClient (будет только один), мы проецируем результат в ваш класс Data
, а не выполняем преобразование за пределы наблюдаемого поток.
Я внес небольшие изменения в ваши методы. Мне не особенно нравится подобный код с побочными эффектами (передача в коллекцию, чтобы внести свой вклад, кажется вектором ошибок), но я позволю это. Кроме этого, я думаю, что это должно работать очень хорошо.