2017-10-13 66 views
-1

在這個問題Why I need to overload the method when use it as ThreadStart() parameter?,我得到了保存在單獨的線程問題的文件以下解決方案(必須刪除時保存文件或添加PersonEntity的新實例):重新啓動線程時,它會停止

private ObservableCollection<PersonEntitiy> allStaff; 
private Thread dataFileTransactionsThread; 

public staffRepository() { 
    allStaff = getStaffDataFromTextFile(); 
    dataFileTransactionsThread = new Thread(UpdateDataFileThread); 
} 

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); 

} 

現在,如果順序刪除PersonEntity的兩個實例,則會發生System.Threading.ThreadStateException: Thread is still executing or don't finished yet. Restart is impossible.

我明白這個例外的意思是作爲一個整體,但是,下面的解決方案還不夠:下一次,文件將不會被保存。

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

也許最好在完成後重新啓動線程,然後再次保存該文件。但是,還需要提供代碼,以便在將按順序刪除三個或更多實例的情況下。就概念層面而言,很簡單:我們只需要最新的allStaff集合,因此以前未保存的allStaff集合或不再需要。

如何才能在C#上實現上述概念?

+0

「將被連續刪除三個或更多實例」是什麼意思? – Enigmativity

+0

一旦'UpdateDataFileThread'完成,你的線程就會結束。你必須每次開始一個新的。 – Enigmativity

+0

@Enigmativity,「將被刪除」 - 表示用戶將通過「刪除」按鈕刪除三個或更多列表項(這是來自集合的PersonEntity實例); 「順序」 - 不是在同一時間。對不起我的英語不好。 –

回答

2

我打算建議使用微軟的Reactive Framework。 NuGet「System.Reactive」。

然後,你可以這樣做:

IObservable<List<PersonEntity>> query = 
    Observable 
     .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
      h => allStaff.CollectionChanged += h, h => allStaff.CollectionChanged -= h) 
     .Throttle(TimeSpan.FromSeconds(2.0)) 
     .Select(x => allStaff.ToList()) 
     .ObserveOn(Scheduler.Default); 

IDisposable subscription = 
    query 
     .Subscribe(u => 
     { 
      string containsWillBeSaved = ""; 
      // ... 
      File.WriteAllText(fullPathToDataFile, containsWillBeSaved); 
      System.Diagnostics.Debug.WriteLine("Data Save Successful"); 
     }); 

該代碼會看你allStaff收集所有的更改,然後,對每一個變化,它會等待2秒鐘,看看是否有任何其他的變化來通,如果他們不要它然後需要您的收藏副本(這是線程工作的關鍵),它可以節省您的收藏。

它每兩秒鐘只能保存一次,只有當有一個或多個更改時纔會保存。

+0

謝謝你的回答!我會試試看! –