我正在将Android应用程序移植到Windows Phone 7,并且在浏览System.Threading命名空间文档以及Web上的各种教程和示例时,我仍然缺少一些花絮。
到目前为止我学到了什么:
1,创建一个线程并在该线程上执行一个函数:
using System.Threading;
...
Thread newThread = new Thread(new ThreadStart(MyMethod()));
newThread.Start();
2,要同步对象(类似于Android的synchronized()关键字):
lock(this)
{
// Do synchronized stuff here.
}
我缺少什么:
3,如何从调用线程上的工作线程调用委托?通过“调用线程”我的意思是创建我的工作线程的线程,而不是工作线程本身。例如,在Android上我会执行以下操作(在主ui线程上调用它,也是可接受的解决方案):
Message.obtain(m_messageHandler, message, null).sendToTarget();
我找到了AsyncCallback。这样做我需要它吗?有人有例子吗?关于什么线程调用回调例程,不是很清楚。
4,在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的任何指导,谢谢!
答案 0 :(得分:3)
另一种在另一个线程上启动的方法是
ThreadPool.QueueUserWorkItem(state => {
// do work here
}, myStateObjectOrNull);
我发现这种语法比创建Thread
更容易。
要重新开始UI线程,这对于将更新UI的anthing至关重要,您需要Dispatcher
的句柄。获得一个的最简单方法如下
Deployment.Current.Dispatcher.BeginInvoke(() => {
// do work here
});
你不能在WP7上wait
。您需要使用回调,事件或Reactive Extensions。通过API有两种方法可以编写等待的代码,但它只会锁定应用程序,等待会阻止它等待运行的代码。
答案 1 :(得分:1)
根据您的需要,Silverlight等效于Win32事件可以是ManualResetEvent
或AutoResetEvent
。
正如Richard可能试图建议的那样,Monitor
类也提供了类似的等待/信号语义。我倾向于认为监视器控制对资源的访问,而事件只是让你知道发生了什么。
答案 2 :(得分:0)
最终你必须查看BackgroundWorker课程。 我认为它与Android中的AsyncTask类相同。 BackgroundWorker包含两个事件:一个被调用以在另一个线程中完成工作,并且将在UI线程中调用已完成的事件。
var worker = new BackgroundWorker();
worker.DoWork += delegate { ... };
worker.RunWorkerCompleted += delegate { ... };
worker.RunWorkerAsync();