与Android相比,线程化Wp7

时间:2011-08-23 03:23:14

标签: c# windows-phone-7

我正在将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的任何指导,谢谢!

3 个答案:

答案 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事件可以是ManualResetEventAutoResetEvent

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

答案 2 :(得分:0)

最终你必须查看BackgroundWorker课程。 我认为它与Android中的AsyncTask类相同。 BackgroundWorker包含两个事件:一个被调用以在另一个线程中完成工作,并且将在UI线程中调用已完成的事件。

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