void UpdateCounters(object state) { while (true) { // Wait for the signal to be set signal.WaitOne(); try { using (mailbox.Messages.ReaderLock) { unread = mailbox.Messages.Count(m => m.IsRead == false && m.MessageFolder != Folders.Trash && m.MessageFolder != Folders.None && m.MessageFolder != Folders.Spam); starred = mailbox.Messages.Count(m => m.IsStarred && m.MessageFolder != Folders.Trash && m.MessageFolder != Folders.None && m.MessageFolder != Folders.Spam); todo = mailbox.Messages.Count(m => m.IsTodo && m.MessageFolder != Folders.Trash && m.MessageFolder != Folders.None && m.MessageFolder != Folders.Spam); waitingFor = mailbox.Messages.Count(m => m.IsWaitingFor && m.MessageFolder != Folders.Trash && m.MessageFolder != Folders.None && m.MessageFolder != Folders.Spam); someday = mailbox.Messages.Count(m => m.IsSomeday && m.MessageFolder != Folders.Trash && m.MessageFolder != Folders.None && m.MessageFolder != Folders.Spam); drafts = mailbox.Messages.Count(m => m.IsDraft && m.MessageFolder != Folders.Trash && m.MessageFolder != Folders.None && m.MessageFolder != Folders.Spam); } Thread.CurrentThread.ExecuteOnUIThread(delegate { using (labels.ReaderLock) labels.ForEach(l => l.Refresh()); OnPropertyChanged("Unread"); OnPropertyChanged("Starred"); OnPropertyChanged("Todo"); OnPropertyChanged("WaitingFor"); OnPropertyChanged("Someday"); LabelsViewSource.View.Refresh(); }); } catch (Exception ex) { Logger.Error("An error has occured while trying to update counters. Exception = {0}", LogSource.UI, ex); } } }