Этот вопрос является продолжением темы Инициализация потока в конструкторе класса. На англоязычном 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#, чтобы реализовать выше задуманное?
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости