繁体   English   中英

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

[英]How can I synchronize multiple threads in WP7?

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

这是我的问题:

我正在尝试通过另一个与我正在使用的对象的API一起使用的线程来“同步” UI线程。 换句话说,我想确保在用户通过按下“后退”按钮关闭当前XAML页面之前,正在使用的对象(该对象是XAML页面后面的C#类的一部分)已被释放。

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

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

不幸的是,尽管我确实重写了NavigatedFrom和OnBackKeyPress方法,但我没有看到防止用户按下“后退”按钮时关闭XAML页面的方法。 即使它们根本不包含任何代码,XAML页面还是会被关闭。

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

谢谢。

这样做的原因是,如果我在NavigatedFrom处理程序中有释放代码,则UI线程可能会尝试释放该对象,而实际上其他线程正在使用该对象。 因此,我确实必须以某种方式同步此对象的释放。

真的不是问题。 如果还要在Dispatcher上对导航进行排队,则不会收到任何NullReferenceExceptions。

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

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

如果您按“类”的意思是“ ViewModel”,那么是的,它绝对应该在ViewModel中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM