У меня есть функция в моем приложении lightwitch, которое загружает CSV-файл с сайта, который я хочу переписать с использованием Rx-структуры и предоставить возможность синхронно называть его.Наблюдаемый и Webclient для получения csv
Ниже приведены фрагменты кода для старой и новой функции. Однако новая функция не работает, вызов ParseCSV никогда не происходит. Я хотел бы знать, почему и если существует лучшее решение, не стесняйтесь предоставлять.
Старый Код:
private void ObservableCollection<Data> collection;
public ObservableCollection<Data> GetData(string url, ObservableCollection<Data> targetCollection)
{
collection = targetCollection;
if (!string.IsNullOrEmpty(url))
{
WebClient wc = new WebClient();
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCompleted_ParseCSV);
wc.OpenReadAsync(new Uri(url));
}
return collection;
}
private void OpenReadCompleted_ParseCSV(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error != null) return;
var webClient = sender as WebClient;
if (webClient == null) return;
try
{
using (StreamReader reader = new StreamReader(e.Result))
{
string contents = reader.ReadToEnd();
...
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Error parsing CSV!\n" + ex.Message);
}
}
Новый код (с Rx):
private void ObservableCollection<Data> collection;
public ObservableCollection<Data> GetData(string url, ObservableCollection<Data> targetCollection)
{
collection = targetCollection;
if (!string.IsNullOrEmpty(url))
{
var result = Observable.FromEventPattern<OpenReadCompletedEventHandler, OpenReadCompletedEventArgs>
(
ev => webClient.OpenReadCompleted += ev,
ev => webClient.OpenReadCompleted -= ev
)
.Select(o => o.EventArgs.Result)
.FirstOrDefault()
.ParseCSV();
// Call the Async method
webClient.OpenReadAsync(new Uri(url));
}
return collection;
}
private void ParseCSV(this Stream stream)
{
try
{
using (StreamReader reader = new StreamReader(e.Result))
{
string contents = reader.ReadToEnd();
...
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Unable to get history data!\n" + ex.Message);
}
}
Только быстрый намек - вы злоупотребляя Rx - все это должно быть сделано в одном запросе без 'FirstOrDefault' в поле зрения ... – Enigmativity
Это моя первая попытка сделать синхронный вызов (идея от функционального Алхимия: Синхронизация Silverlight) – sysboard
Rx все о том, чтобы быть асинхронным. Если вы попытаетесь сделать это синхронно, вы, скорее всего, получите тупики. Используете ли вы инструмент «LinqPad»? Если нет, вы должны скачать его. Это отлично подходит для использования Rx-кода в среде с «царапинами». – Enigmativity