我创建了一个使用Observable Lists的应用程序。我已经使ObservableList类线程安全(我认为),现在在我的应用程序中工作正常。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”的
我该如何解决这个问题?我是否正朝着正确的方向思考?
你为什么在服务中使用Dispatcher? – ken2k 2013-04-29 11:42:07
我不知道。我有几个线程正在运行并观察一些硬件组件。你有什么建议? – Joetjah 2013-04-29 11:48:36
“OnCollectionChanged”事件附加了什么样的处理程序?由于您没有UI(Windows服务),我怀疑它不需要将您的事件处理程序编组到特定的线程。 – ken2k 2013-04-29 11:52:55