我已经开始开发Leap Motion应用程序,这让我疯狂。每当我退出应用程序时,负责清理Leap Motion控制器的代码都会挂起。
public void CleanUp()
{
_lmController.RemoveListener(_lmListener);
_lmController.Dispose();
}
我在演示者类的主线程中创建了控制器和监听器:
public MainViewPresenter(IMainView view, IApplicationController applicationController)
{
_view = view;
_applicationController = applicationController;
_view.Presenter = this;
_lmListener.Frame += _lmListener_Frame;
_lmController.AddListener(_lmListener);
}
Cleanup()方法也是在视图的FormClosing事件上调用的presenter方法。奇怪的是,当我从_listener_Frame()
调用它时它完全正常,它在一个单独的Leap Motion创建的无名线程上运行!
_lmListener_Frame()
本身就位于演示者中。它只是从_lmController
获取数据,创建一个视图模型并将其发送到视图,然后使用Invoke
更新显示数据。
我试过在Dispose()中调用CleanUp的东西(视图和演示者(当然不是多余的)),这也不起作用。
我承认我不是线程专家,但是我看不出这里是否有任何冲突,以及为什么RemoveListener在控制器线程中工作,而不是从主线程中,实际上添加了侦听器。任何帮助表示赞赏!
完全偶然,我今天找到了解决方案!事实证明,“调用”调用是罪魁祸首,它应该一直是BeginInvoke,尽管在WinForms设置指南中没有提到过。我猜测它导致了控制器线程的死锁,并且在第一次GUI更新后它一定会崩溃。
答案 0 :(得分:0)
在Windows窗体应用程序中,以下内容对我有用:
protected override void Dispose(bool disposing)
{
try
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
this.controller.RemoveListener(this.listener);
this.controller.Dispose();
}
}
finally
{
base.Dispose(disposing);
}
}
}
不过,我之前写过它,并且不记得为什么它需要比你尝试的更复杂。 (这里有完整示例:https://developer.leapmotion.com/documentation/csharp/devguide/Project_Setup_WinForms.html)