Wp7与Android的线程比较
本文关键字:线程 比较 Android Wp7 | 更新日期: 2023-09-27 18:06:35
我正在将一款Android应用移植到Windows Phone 7上。线程命名空间文档和网络上的各种教程和示例,我仍然缺少一些花絮。
我所学到的:
1、创建一个线程并在该线程上执行一个函数: using System.Threading;
...
Thread newThread = new Thread(new ThreadStart(MyMethod()));
newThread.Start();
2、同步对象(类似Android的synchronized()关键字):
lock(this)
{
// Do synchronized stuff here.
}
我错过了什么:
我如何从我的工作线程在调用线程上调用委托?通过"调用线程",我指的是创建工作线程的线程,而不是工作线程本身。例如,在Android上,我会这样做(这将在主ui线程上调用它,也是一个可接受的解决方案): Message.obtain(m_messageHandler, message, null).sendToTarget();
我已经找到AsyncCallback。这能达到我的目的吗?有人能举个例子吗?关于哪个线程调用回调例程不是很清楚。
在Android上,工作线程可以执行wait()来暂停,直到调用线程调用interrupt()。这类似于win32中的Event和WaitForObject()。例如在Android上: // Worker thread does:
synchronized (this)
{
wait();
}
...
// Main thread calls:
synchronized(this)
{
if(m_thread != null)
{
// Interrupt any wait()s.
m_thread.interrupt();
}
}
一旦线程被中断,工作线程在wait()调用后继续执行。
任何关于#3和#4的指导将非常感激,谢谢!
另一种在另一个线程上启动某事的方法是
ThreadPool.QueueUserWorkItem(state => {
// do work here
}, myStateObjectOrNull);
我发现这种语法比创建Thread
更容易。
要在UI线程上工作,这对于任何更新UI的事情都是必不可少的,您需要一个Dispatcher
的句柄。获取一个最简单的方法如下
Deployment.Current.Dispatcher.BeginInvoke(() => {
// do work here
});
您不能在WP7上wait
。你需要使用回调、事件或响应式扩展。在API中,有几种方法可以让代码等待,但它只会锁定应用程序,等待会阻止等待运行的代码
Silverlight等效的Win32事件是ManualResetEvent
或AutoResetEvent
,这取决于您的需要。
正如Richard可能一直试图建议的那样,Monitor
类也提供了类似的等待/信号语义。不过,我倾向于认为监视器控制对资源的访问,而事件只是让您知道发生了什么事情。
最后你必须检查BackgroundWorker类。我想这和Android中的AsyncTask类是一样的。BackgroundWorker包含两个事件:一个被调用在另一个线程中完成工作,完成的事件将在UI线程中调用。
var worker = new BackgroundWorker();
worker.DoWork += delegate { ... };
worker.RunWorkerCompleted += delegate { ... };
worker.RunWorkerAsync();