Однако у меня возникла странная проблема. Приложение, которое я пишу (пожалуйста, без комментариев о том, насколько плох код), работает. Однако изначально он не обновлял пользовательский интерфейс (WPF). Итак, следя за кусочками на различных форумах, я возился так, чтобы работа (в настоящее время просто чтение в структуре папок) выполняла свою работу в новом потоке. В процессе я попробовал использовать ConcurrentQueue для передачи сообщений между работником и пользовательским интерфейсом. Это работало путем опроса (чего я бы предпочел не делать, поскольку время от времени он использовал изрядную часть процессора для достаточно регулярного опроса, но другие работают целую вечность без изменений). Итак, я нашел ObservableConcurrentQueue как оболочку для ConcurrentQueue и настроил (я думаю) подписку на события. (по прочтении кажется, что существует тысяча разных способов снять шкуру с кота, отправляющего сообщения, этот показался самым простым/самым простым)
Это должно было сработать, но я' Теперь я получаю «System.InvalidOperationException: 'Вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток.' когда FolderCount будет увеличен.
Я не уверен, как и почему другой поток теперь внезапно владеет им, хотя раньше все было в порядке. Единственный поток, который я создаю, - это рабочий. поток, который успешно отправлял сообщения через параллельную очередь и не должен запускать рассматриваемый код. По моей интерпретации, все остальное должно быть в том же потоке (когда я создавал подписку в рабочем потоке, это было так). выдал мне ту же ошибку, но переключил ее на Класс/поток MainWindow должен был это исправить?).
Ниже приведены соответствующие фрагменты кода, которые должны показать, что я делаю неправильно. Я не сомневаюсь, что делаю это ". плохо» и, возможно, даже пытается смешивать методологии.
Код: Выделить всё
{
public void SearchFolder(string path)
{
Task.Run(() => { SFolders(path); });
}
private void SFolders(string path)
{
if (Directory.Exists(path)) {
_pm.Add(ProcessMessages.FolderCountAdd); // THIS IS WHERE IT CHUCKS A HISSY FIT
// OTHER STUFF - rest of routine
}
// MORE STUFF
}
}
public partial class MainWindow : Window
{
public MainWindow mw = null;
public ProcessMessages pm = null;
public Searching searching = null;
public MainWindow()
{
InitializeComponent();
mw = this;
pm = new ProcessMessages();
searching = new Searching(pm, this);
pm._queue.ContentChanged += OnObservableConcurrentQueueContentChanged;
}
private void OnObservableConcurrentQueueContentChanged(object sender, NotifyConcurrentQueueChangedEventArgs args)
{
// Item Added
if (args.Action == NotifyConcurrentQueueChangedAction.Enqueue)
{
int message;
pm.Fetch(out message);
while (message > 0)
{
switch (message)
{
case ProcessMessages.FolderCountAdd: { FolderCount++; break; }
case ProcessMessages.FileCountAdd: { FileCount++; break; }
}
pm.Fetch(out message);
}
}
}
public class ProcessMessages
{
public ObservableConcurrentQueue _queue = new ObservableConcurrentQueue();
public int Count => _queue.Count;
public void Add(int message)
{
if (message == null) throw new ArgumentNullException(nameof(message));
_queue.Enqueue(message);
}
public bool Fetch(out int message)
{
return _queue.TryDequeue(out message);
}
}
}
Заранее спасибо всем/всем, кто может объяснить, что происходит не так (даже если это в корне неправильно с самого начала).
Подробнее здесь: https://stackoverflow.com/questions/792 ... ading-woes