C#: Перезапуск потока по его завершению

228
14 октября 2017, 16:52

Этот вопрос является продолжением темы Инициализация потока в конструкторе класса. На англоязычном StackOverflow я получил такое решение:

private ObservableCollection<PersonEntitiy> allStaff;
private Thread dataFileTransactionsThread;
#region Constructor
public staffRepository() {
    allStaff = getStaffDataFromTextFile();
    dataFileTransactionsThread = new Thread(UpdateDataFileThread);
}
#endregion
public void UpdateDataFile(ObservableCollection<PersonEntitiy> allStaff)     
{
    dataFileTransactionsThread.Start(allStaff);
    // If you want to wait until the save finishes, uncomment the following line
    // dataFileTransactionsThread.Join();
}
private void UpdateDataFileThread(object data) {
    var allStaff = (ObservableCollection<PersonEntitiy>)data;
    System.Diagnostics.Debug.WriteLine("dataFileTransactions Thread Status:"+ dataFileTransactionsThread.ThreadState);
    string containsWillBeSaved = "";
    // ...
    File.WriteAllText(fullPathToDataFile, containsWillBeSaved);
    System.Diagnostics.Debug.WriteLine("Data Save Successfull");
    System.Diagnostics.Debug.WriteLine("dataFileTransactions Thread Status:" + dataFileTransactionsThread.ThreadState);

Если быстро удалить два экземпляра подряд, то возникнет исключение System.Threading.ThreadStateException: Поток ещё выполняется или пока завершается. Перезапуск невозможен..

Суть исключения в принципе ясна, но решения ниже будет недостаточно, ведь тогда просто не произойдёт сохранения файла при удалении второго экземпляра:

if (!dataFileTransactionsThread.IsAlive) {
    dataFileTransactionsThread.Start(allStaff);
}

Наверное, хорошим решением будет перезапустить данный поток, когда он будет завершен, и тогда уже выполнить повторное сохранение. Правда, надо будет предусмотреть случай быстрых трёх и более удалений, но тут, опять же на словах, подход простой: нам нужен только самый свежий экземляр коллекции allStaff, потому при появлении очереди на вызова UpdateDataFile нужно как-то оставить в очереди только последний вызов с самым свежим экземпляром allStaff. Какие есть средства в C#, чтобы реализовать выше задуманное?

READ ALSO
Проблема с фоном строк в Datagrid WPF

Проблема с фоном строк в Datagrid WPF

Имеется DataGridPeoples :

287
WPF&amp;MVVM: Привязка свойств VM

WPF&MVVM: Привязка свойств VM

В вопросе Получение данных во ViewModel из делегированного объекта по поводу приведённого ниже кода View с привязками и паттерна MVVM в целом я понял...

233
Асинхронный метод запускает AsyncCallback в текущем потоке

Асинхронный метод запускает AsyncCallback в текущем потоке

Имеется сервер класса TcpListenerОн принимает входящие подключения методом BeginAcceptTcpClient (AsyncCallback, Object)

222
Чтение данных из excel

Чтение данных из excel

Нашёл на просторах StackOverflow пример как читать данные из excelНо вылетают ошибки

174