Я создал приложение, которое использует Observable Lists. Я сделал класс ObservableList потокобезопасным (я думаю), и теперь он отлично работает в моем приложении.Threading в службе Windows
Теперь я пытаюсь установить мое приложение как услугу. Это прекрасно работает и до тех пор, пока что-то не добавится в список. Я думаю, что нить там просто умирает. У меня есть следующий код:
/// <summary>
/// Creates a new empty ObservableList of the provided type.
/// </summary>
public ObservableList()
{
//Assign the current Dispatcher (owner of the collection)
_currentDispatcher = Dispatcher.CurrentDispatcher;
}
/// <summary>
/// Executes this action in the right thread
/// </summary>
///<param name="action">The action which should be executed</param>
private void DoDispatchedAction(Action action)
{
if (_currentDispatcher.CheckAccess())
action.Invoke();
else
_currentDispatcher.Invoke(DispatcherPriority.DataBind, action);
}
/// <summary>
/// Handles the event when a collection has changed.
/// </summary>
/// <param name="e"></param>
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
DoDispatchedAction(() => base.OnCollectionChanged(e));
}
Во время отладки, я видел Collection.Add(object)
называют. Он запускает функцию DoDispatchedAction
, и последнее, что поражает отладчик, - _currentDispatcher.Invoke(DispatcherPriority.DataBind, action);
. После этого приложение продолжается, но код после Collection.Add(object)
больше не выполняется. Код, который первоначально добавил элемент в ObservableList, не продолжается. Вот почему я думаю, что нить умирает или что-то в этом роде.
При проверке действия в отладчике, я узнал, что следующее сообщение было:
ApartmentState = «_currentDispatcher.Thread.ApartmentState» бросил исключение типа «System.Threading.ThreadStateException»
Как я могу решить эту проблему? Я даже думаю в правильном направлении?
Почему вы используете 'Диспетчер' в службе? – ken2k
Не знаю точно. У меня есть несколько потоков и просмотр некоторых аппаратных компонентов. Что ты предлагаешь? – Joetjah
Какой обработчик прикреплен к событию 'OnCollectionChanged'? Поскольку у вас нет пользовательского интерфейса (служба Windows), я подозреваю, что не требуется, чтобы маркер возвращал обработчик событий в конкретный поток. – ken2k