如何在WP7中同步多个线程?

时间:2011-10-13 10:49:49

标签: multithreading silverlight windows-phone-7

我是 Windows Phone 7 Silverlight 的新手,但我确实有win32和线程的经验。

这是我的问题:

我正在尝试“同步”UI线程w /另一个似乎由我正在使用的对象的API使用的线程。换句话说,我想确保在用户通过按下后退按钮取消当前的XAML页面之前,我正在使用的对象(XAML页面后面的C#类的一部分)将被释放。

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

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:0)

  

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

不是真的有问题。如果您对Dispatcher上的导航进行排队,则不会获得任何NullReferenceExceptions。

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

  

此计时器是否仅与定义它的XAML页面后面的C#类相关联?

如果您通过“class”表示“ViewModel”,那么是的,它最明确地应该在ViewModel中。