我创建了一个使用可观察列表的应用程序。我已经使 ObservableList 类线程安全(我认为),它现在在我的应用程序中运行良好。
现在我正在尝试将我的应用程序安装为服务。这也很好,直到某些东西被添加到列表中。我认为那里的线程只是死了。我有以下代码:
/// <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”类型的异常
我怎么解决这个问题?我什至在思考正确的方向吗?