2013-06-25 26 views
1

Reading.GetUnProcessReadings().ToList();一次返回20個事務。我需要循環,直到它沒有返回任何交易。從方法返回的循環列表直到該方法不給我記錄

我有下面的代碼,我不認爲這是有效的:

IEnumerable<SSS.ServicesConfig.data.Reading> readings = Reading.GetUnProcessReadings().ToList();; 
    var gpsreadings = new List<TruckGpsReading>(); 

    do 
    { 
     gpsreadings = new List<TruckGpsReading>(); 
     if (readings.Count() > 0) 
     { 
     foreach (var reading in readings) 
     { 
      Logging.Log("Starting ProcessGpsFile.ProcessReading 3", "ProcessReading", Apps.RemoteTruckService); 
      var gpsreading = new TruckGpsReading(); 
      gpsreading.DateTimeOfReading = reading.DateTimeOfReading; 
      gpsreading.Direction = reading.Direction; 
      gpsreading.DriverNumber = CurrentIniSettings.DriverNumber; 
      gpsreading.Latitude = (float)reading.Latitude; 
      gpsreading.Longitude = (float)reading.Longitude; 
      gpsreading.Speed = reading.Speed; 
      gpsreading.TruckNumber = CurrentIniSettings.TruckNumber; 
      gpsreadings.Add(gpsreading); 
     } 

     var response = client.SaveGpsReadings(globalSetting.TokenId, globalSetting.SourceId, gpsreadings.ToArray()); 
     if (response != "true") 
     { 
      Logging.Log("ProcessGpsFile.ProcessReading: " + response, "ProcessReading", Apps.RemoteTruckService); 
     } 
     else 
     { 
      Logging.Log("ProcessGpsFile.ProcessReading: Reading.DeleteGpsReadings(readings)", "ProcessReading", Apps.RemoteTruckService); 
      SSS.ServicesConfig.data.Reading.DeleteGpsReadings(readings);  
     } 
     } 
     readings = Reading.GetUnProcessReadings().ToList(); 

    } while (readings.Count() > 0); 

是否有這樣做的更好的辦法?

**編輯* *

public static IEnumerable<Reading> GetUnProcessReadings() 
{ 
    try 
    { 
    using (var context = new SuburbanEntities()) 
    { 
     return (from r in context.Readings 
      where r.IsPublished == false 
      select r).Take(10).ToList(); 
    } 
    } 
    catch (Exception ex) 
    { 
    Logging.Log("An error occurred.", "GetPpsSetting", Apps.ServicesConfig, ex); 
    return null; 
    } 
} 
+0

是什麼'Reading.GetUnProcessReadings()'返回? – Andrei

+0

如果沒有進入Reading類,我們不知道如何回答這個問題。 – catfood

+0

對不起,我添加了它。人們必須學會閱讀思想:P – ErocM

回答

3

從提供的代碼很難找到一個最佳的解決方案,但是......

沒有看到嚴重的問題與代碼一樣,除了幾個暗示外:

  1. 使用while (readings.Count() > 0) {},而不是do/while,因爲已經有第一個請求那裏可能是沒有讀數解析。

  2. 如果您可以更改Reading.GetUnProcessReadings()中的代碼,則可以選擇使用yield進行查看。所以你會避免不必要的ToList(..)通話,所以每次都會有新的List<T>發生,並且完全避免while循環,只會用foreach

2

而是一切都在一個DoWhile是的,爲什麼不把if語句在你的foreach循環的結束,基本上讀取

if(readings.count() <=0) 
{ 
    break; 
} 
0

如果Reading.GetUnProcessReadings()給你的東西可迭代的,它有可能不因爲.ToList()通常是您在創建IEnumerable時所做的工作,爲什麼不重複它呢?

東西或多或少這樣的:

public void MyBigWrapperMethod() 
{ 
    var gpsreadings = new List<TruckGpsReading>(); 
    foreach (var reading in Reading.GetUnProcessReadings()) 
    { 
     Logging.Log("Starting ProcessGpsFile.ProcessReading 3", "ProcessReading", Apps.RemoteTruckService); 
     var gpsreading = new TruckGpsReading(); 
     gpsreading.DateTimeOfReading = reading.DateTimeOfReading; 
     gpsreading.Direction = reading.Direction; 
     gpsreading.DriverNumber = CurrentIniSettings.DriverNumber; 
     gpsreading.Latitude = (float)reading.Latitude; 
     gpsreading.Longitude = (float)reading.Longitude; 
     gpsreading.Speed = reading.Speed; 
     gpsreading.TruckNumber = CurrentIniSettings.TruckNumber; 
     gpsreadings.Add(gpsreading); 
    } 

    var response = client.SaveGpsReadings(globalSetting.TokenId, 
    globalSetting.SourceId, gpsreadings.ToArray()); 
    if (response == "true") 
    { 
     // do stuff if it works 
    } 
    else 
    { 
     // do stuff if it doesn't work 
    } 
} 

此外,還有一個非常好的機會,client對象的SaveGpsReadings方法並不真正需要的最後一個參數轉換爲Array形式。考慮重寫,如果可以的話,需要收集TruckGpsReading對象的集合。

甚至比這更遠,你確定你需要一次性保存所有的GPS讀數嗎?有沒有辦法一次保存一個?那麼你可以有像

client.SaveSingleGpsReading (globalSetting.TokenId, globalSetting.SourceId, gpsreading); 

正確的循環內。

我得到的最主要的是你似乎在想辦法收集東西,把它按摩到不同的集合類型,在整個集合上運行一個過程,按摩輸出變成了不同的集合類型......當有效的事情要做的就是拉一個輸入,做你需要的東西,把它發送到輸出,然後重複。

當您不需要時,不要保留巨大的數據緩衝區。然後,如何管理所有收藏的問題就變得沒有意義了。

0

這是通過事件做的一種方式。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 

namespace BackgroundWorkerExample 
{ 
public class Program 
{ 
    private event EventHandler<EventArgs<List<SSS.ServicesConfig.data.Reading>>> ReadingAvailable; 

    protected virtual void OnReadingAvailable(List<SSS.ServicesConfig.data.Reading> list) 
    { 
     EventHandler<EventArgs<List<SSS.ServicesConfig.data.Reading>>> handler = ReadingAvailable; 
     if (handler != null) 
     { 
      handler(this, new EventArgs<List<SSS.ServicesConfig.data.Reading>> (list)); 
     } 
    } 

    private BackgroundWorker bw = new BackgroundWorker(); 

    void Main(string[] args) 
    { 
     this.ReadingAvailable +=Program_ReadingAvailable; 
     bw.DoWork +=bw_DoWork; 

     if (bw.IsBusy != true) 
     { 
      bw.RunWorkerAsync(); 
     } 
    } 

    private void Program_ReadingAvailable(object sender, EventArgs<List<SSS.ServicesConfig.data.Reading>> e) 
    { 
     List<SSS.ServicesConfig.data.Reading> list = e.Value; 

     // for each item in the list do something. 
     foreach (var reading in list) 
     { 
      Logging.Log("Starting ProcessGpsFile.ProcessReading 3", "ProcessReading", Apps.RemoteTruckService); 
      var gpsreading = new TruckGpsReading(); 
      gpsreading.DateTimeOfReading = reading.DateTimeOfReading; 
      gpsreading.Direction = reading.Direction; 
      gpsreading.DriverNumber = CurrentIniSettings.DriverNumber; 
      gpsreading.Latitude = (float)reading.Latitude; 
      gpsreading.Longitude = (float)reading.Longitude; 
      gpsreading.Speed = reading.Speed; 
      gpsreading.TruckNumber = CurrentIniSettings.TruckNumber; 
      gpsreadings.Add(gpsreading); 
     } 

     var response = client.SaveGpsReadings(globalSetting.TokenId, globalSetting.SourceId, gpsreadings.ToArray()); 
     if (response != "true") 
     { 
      Logging.Log("ProcessGpsFile.ProcessReading: " + response, "ProcessReading", Apps.RemoteTruckService); 
     } 
     else 
     { 
      Logging.Log("ProcessGpsFile.ProcessReading: Reading.DeleteGpsReadings(readings)", "ProcessReading", Apps.RemoteTruckService); 
      SSS.ServicesConfig.data.Reading.DeleteGpsReadings(readings); 
     } 
    } 

    private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // if there is something to read 
     IEnumerable<SSS.ServicesConfig.data.Reading> readings = Reading.GetUnProcessReadings().ToList(); 
     if (readings.Count() > 0) 
     { 
      OnReadingAvailable(readings); 
     } 
    } 
} 

public class EventArgs<T> : EventArgs 
{ 
    private readonly T m_value; 

    protected EventArgs() 
     : base() 
    { 
     m_value = default(T); 
    } 

    public EventArgs(T value) 
    { 
     m_value = value; 
    } 

    public T Value 
    { 
     get { return m_value; } 
    } 
} 
} 
0

代替

IEnumerable<SSS.ServicesConfig.data.Reading> readings 

做...

List<SSS.ServicesConfig.data.Reading> readings 

,因爲你聲明,而不是

var gpsreadings = new List<TruckGpsReading>(); 

明確任務列表....

List<TruckGpsReading> gpsreadings = 

那麼方法裏面你做的工作做

List<SSS.ServicesConfig.data.Reading> readings = Reading.GetUnProcessReadings().ToList(); 
List<TruckGpsReading> gpsreadings = RecursionMethod(readings, new List<TruckGpsReading>()); 

然後創建RecursionMethod ....

private List<TruckGpsReading> RecursionMethod(List<SSS.ServicesConfig.data.Reading> first,List<TruckGpsReading> second) 
     { 
      if (first.Count == 0) 
      { 

      } 
      else 
      { 
       foreach (var item in first) 
       { 
        //do the work of adding that you where doing.. 
        Logging.Log("Starting ProcessGpsFile.ProcessReading 3", "ProcessReading", Apps.RemoteTruckService); 
        var gpsreading = new TruckGpsReading(); 
        gpsreading.DateTimeOfReading = reading.DateTimeOfReading; 
        gpsreading.Direction = reading.Direction; 
        gpsreading.DriverNumber = CurrentIniSettings.DriverNumber; 
        gpsreading.Latitude = (float)reading.Latitude; 
        gpsreading.Longitude = (float)reading.Longitude; 
        gpsreading.Speed = reading.Speed; 
        gpsreading.TruckNumber = CurrentIniSettings.TruckNumber; 
        second.Add(gpsreading); 
        first.Remove(item); 
        //you need to break or you will get an invalidoperation exception 
        break; 

       } 

       RecursionMethod(first,second); 
      } 
      return second; 
     }