2011-10-13 55 views
0

我是新来的开发Windows Phone 7Silverlight但我确实有win32和线程的经验。如何在WP7中同步多个线程?

我的问题是:

我想“同步”的UI线程瓦特/似乎由对象的API的,我有工作可以用另一个线程。换句话说,我想确保在用户按下后退按钮来关闭当前的XAML页面之前,解除分配我正在使用的对象,它是XAML页面后面的C#类的一部分。

其原因是,如果我在NavigatedFrom处理程序中的代码重新分配,UI线程可能会尝试释放对象WHILE它实际上是由其他线程使用。因此,我必须以某种方式同步该对象的释放。

理想情况下,当用户按下电话上的后退按钮时,我所做的就是将标志“退出”设置为true以指示用户打算退出。在另一个线程上运行的对象所使用的方法将会“看到”该标志被设置,然后BeginInvoke *强调文本*对象的解除分配代码(仅仅是因为对象已经在UI线程上分配了,所以我认为在同一线程上释放它是有意义的,不知道它的内部工作原理。)最后,它会调用NavigationService.GoBack()以确保'有序'退出。

不幸的是,我没有看到阻止XAML页面在用户按下后退按钮时被解散的方法,尽管我没有覆盖NavigatedFrom和OnBackKeyPress方法。尽管它们根本不包含任何代码,但XAML页面无论如何都被解散了。

另一件有趣的事情,我会很感激你对此的评论,是我有一个计时器(System.Windows.Threading.DispatchTimer)。这个计时器是否仅与定义它的XAML页面后面的C#类关联?换句话说,是否存在与每个XAML页面相关的“消息泵”的概念,还是仅有一个基本上由所有XAML页面使用的UI线程的消息泵?我这样问,因为尽管我忽略了C#类定义了定时器的XAML页面,但它仍然在运行。

谢谢。

+0

如果你描述如何在.NET代码中“释放”某些东西,这可能会有所帮助?任何线索什么这个神秘的对象可能会帮助?有些第三方的东西? – AnthonyWJones

+0

感谢您的评论。我正在谈论PhotoCamera对象。 MSDN示例指出,在完成w/it时调用其Dispose方法是一个好主意。我担心,如果用户按下后退按钮WHILE PhotoCamera的“CaptureImageAvailable”的事件处理程序将从相机缓冲区中读取(请注意,此处理程序似乎在与UI线程不同的线程中运行),我的代码会尝试在错误的时间(在使用中)从UI线程释放它,导致我的应用程序崩溃。 – MariusVE

回答

0

其原因是,如果我在NavigatedFrom处理程序中的代码重新分配,UI线程可能会尝试释放对象,而它在事实上被其他线程使用。因此,我必须以某种方式同步该对象的释放。

不是一个问题。如果您还将Dispatcher上的导航排队,则不会收到任何NullReferenceExceptions。

只需使用Dispatcher.BeginInvoke(() => NavigationService.Navigate(...))即可进行安全导航。

这会定时器只能定义它一个XAML页面背后的C#类相关联?

如果你通过“class”的意思是“ViewModel”,那么是的,它最明确地应该是在ViewModel中。