2012-03-22 107 views
1

我有一個從網上下載csv文件的功能。我需要擴展它,以便對2個網站依次進行2個呼叫。但是我不知道該怎麼辦呢?Rx Observable - 鏈接

繼承人的功能:

// Define other methods and classes here 
private void GetCSVData(string url1, string url2) 
{ 
    WebClient webClient = null; 
    try 
    { 
     webClient = new WebClient(); 

     var task = Observable.FromEventPattern 
      <OpenReadCompletedEventHandler, OpenReadCompletedEventArgs> 
     (
      ev => webClient.OpenReadCompleted += ev, 
      ev => webClient.OpenReadCompleted -= ev 
     ); 

     // needs to be redone 
     task.Subscribe(t => ParseCSV1(t.EventArgs.Result)); 

     // call ParseCSV1() 
     // then call ParseCSV2() 

     // needs redone, 2 calls to 2 website 
     webClient.OpenReadAsync(new Uri(url1));  
    } 
    catch (WebException wex) 
    { 
     System.Diagnostics.Debug.WriteLine(wex.ToString()); 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine(ex.ToString()); 
    } 
} 

private void ParseCSV1(Stream stream) 
{ 
    // Parse steps... 
} 

private void ParseCSV2(Stream stream) 
{ 
    // Parse steps... 
} 
+1

您的代碼似乎不完整。你有'url1'&'url2'進來,但你用'url'調用'OpenReadAsync'。你的代碼目的不清楚。你能改善這個問題嗎? – Enigmativity 2012-03-23 00:12:03

+1

將2個網址映射到2個可觀察對象,將這2個可觀察對象連接以獲得單個可觀察對象並訂閱它 – Ankur 2012-03-25 12:38:58

回答

1

你有什麼應該是好的。如果您再次致電OpenReadAsync,那麼第二個事件將觸發(每個URL一個),您的訂閱將處理這兩個事件。

您應該簡單地能夠做到以下幾點:

// Call both, will generate two events. 
webClient.OpenReadAsync(new Uri(url1)); 
webClient.OpenReadAsync(new Uri(url2)); 

不過,我懷疑你有一些生命週期的問題,因爲你走出去的範圍與WebClient(它從來沒有妥善處置)。

0

我......在這裏可能不會使用Rx。實際上,這聽起來更適合任務庫;這裏是我可能會做的事情:

void Main() 
{ 
    var webClient = new System.Net.WebClient(); 

    Task.Factory 
     .StartNew(() => GetUrl("http://www.google.com")) 
     .ContinueWith(tsk => ParseCsv(CheckAndHandleError(tsk))) 
     .ContinueWith(tsk => 
      { 
       if(CheckAndHandleError(tsk)) 
        return GetUrl("http://www.yahoo.com"); 
       else 
        return string.Empty; 
      }) 
     .ContinueWith(tsk => ParseCsv(CheckAndHandleError(tsk))); 

} 

private T CheckAndHandleError<T>(Task<T> task) 
{ 
    if(task.IsFaulted) 
    { 
     // you'll need to handle the tsk.Exception here 
     throw new NotImplementedException(); 
    } 
    else 
    { 
     return task.Result; 
    } 
} 

private string GetUrl(string address) 
{ 
    using(var client = new WebClient()) 
    { 
     var stream = client.OpenRead(address); 
     using(var rdr = new StreamReader(stream)) 
     { 
      return rdr.ReadToEnd(); 
     } 
    } 
} 

private bool ParseCsv(string csvText) 
{ 
    // whatever this is 
    Console.WriteLine(csvText); 
    return true; 
} 
相關問題