我在我的lightswitch应用程序中有一个函数,该函数从一个站点下载一个csv文件,我希望使用Rx框架重新编写这个文件并提供同步调用它的可能性。Observable和Webclient获取CSV 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 2012-02-16 12:35:23
这是我第一次拨打电话同步(想法来自功能的尝试炼金术:让Silverlight同步) – sysboard 2012-02-17 08:18:13
Rx全都是关于异步的。如果你试图使它同步,你很可能会陷入僵局。你使用的工具“LinqPad”?如果没有,你应该下载它。在“便笺式”环境中尝试Rx代码非常棒。 – Enigmativity 2012-02-17 11:25:29