Записать записи в файл, когда 500 записей достигнуто или 2 минуты времени прошло с предыдущего файла - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть сценарий, где у меня есть рабочий метод (DoWork ()), который постоянно вызывается веб-службой.

Этот рабочий метод записывает данные в файл, используя (writeToFile ()), и мне нужно записать это в файл при 2 условиях

a), когда количество записей достигло 500 ИЛИ

b) Прошло 2 минуты с момента написания предыдущего файла

Мой пример кода выглядит следующим образом:

public override void DoWork()
{
//-- This worker method is called continuously by the webservice 
List<string> list1 = new List<string>();
List<string> list2 = new List<string>();
int count =0;
//--- Some code that writes the RawData
list1.Add(rawData);
If(list1.Count<=500)
{
list2=list1;
count = WriteToFile(list2);

}
}

public static int WriteToFile(List<string> list)
{
//-- The writing of File Should happen when 500 records reached OR 2 mins passed.

// ---- Logic for writing the list file using the Streamwriter is working fine

}

Мне нужна проверка логи c если

500 записей достигнуто в списке ИЛИ
2 минуты, переданные из предыдущего сгенерированного файла,

только тогда должна произойти запись в файл.

Спасибо:)

1 Ответ

0 голосов
/ 28 апреля 2020

Чтобы сделать его немного более читабельным, я бы использовал здесь небольшого помощника ... Проверка времени:

class TimeCheck{
    private TimeSpan timeoutDuration;
    private DateTime nextTimeout;

    // Default = 2 minutes.
    public TimeCheck(): this(TimeSpan.FromMinutes(2))
    {}

    public TimeCheck( TimeSpan timeout ){
         this.timeoutDuration= timeout;
         this.nextTimeout = DateTime.Now + timeoutDuration;
    }

    public bool IsTimeoutReached => DateTime.Now >= nextTimeout; 

    public void Reset(){
        nextTimeout = DateTime.Now + timeoutDuration;
    }
}

Использование:

// on class level
const int MAXITEMS = 500;
private Lazy<TimeCheck> timecheck = new Lazy<TimeCheck>( () => return new TimeCheck() );
private List<string> list1 = new List<string>();
private readonly object Locker = new object();

public override void DoWork()
{
    lock(Locker){
        // ... add items to list1

        // Write if a) list1 has 500+ items or b) 2 minutes since last write have passed
        if( list1.Count >= MAXITEMS || timecheck.Value.IsTimeoutReached )
        {
            WriteToFile(list1);
            list1.Clear();     // assuming _all_ Items are written.
            timecheck.Value.Reset();
        }
    }
}

Внимание :

  • Если код вызывается несколькими потоками, необходимо убедиться, что он безопасен для потоков. Я использовал lock , что создаст узкое место . Возможно, вы захотите выяснить более изощренный способ, но этот ответ концентрируется на требованиях к условию.

  • Приведенный выше фрагмент предполагает, что list1 не доступен в других местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...