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的指导将非常感激,谢谢!

Wp7与Android的线程比较

另一种在另一个线程上启动某事的方法是

ThreadPool.QueueUserWorkItem(state => {
  // do work here
}, myStateObjectOrNull);

我发现这种语法比创建Thread更容易。

要在UI线程上工作,这对于任何更新UI的事情都是必不可少的,您需要一个Dispatcher的句柄。获取一个最简单的方法如下

Deployment.Current.Dispatcher.BeginInvoke(() => {
  // do work here
});

您不能在WP7上wait。你需要使用回调、事件或响应式扩展。在API中,有几种方法可以让代码等待,但它只会锁定应用程序,等待会阻止等待运行的代码

Silverlight等效的Win32事件是ManualResetEventAutoResetEvent,这取决于您的需要。

正如Richard可能一直试图建议的那样,Monitor类也提供了类似的等待/信号语义。不过,我倾向于认为监视器控制对资源的访问,而事件只是让您知道发生了什么事情。

最后你必须检查BackgroundWorker类。我想这和Android中的AsyncTask类是一样的。BackgroundWorker包含两个事件:一个被调用在另一个线程中完成工作,完成的事件将在UI线程中调用。

var worker = new BackgroundWorker();
worker.DoWork += delegate { ... };
worker.RunWorkerCompleted += delegate { ... };
worker.RunWorkerAsync();