Threading Wp7 по сравнению с Android - PullRequest
0 голосов
/ 23 августа 2011

Я портирую приложение для Android на Windows Phone 7, и, просматривая систему, просматривая документы пространства имен и различные учебные пособия и примеры в Интернете, я все еще пропускаю некоторые лакомые кусочки.

Что я выучил до сих пор:

1, чтобы создать поток и выполнить функцию в этом потоке:

    using System.Threading;

    ...

    Thread newThread = new Thread(new ThreadStart(MyMethod()));
    newThread.Start();

2, для синхронизации объектов (аналогично ключевому слову synchronized () в Android):

    lock(this)
    {
      // Do synchronized stuff here.
    }

Чего мне не хватает:

3, Как я могу вызвать делегата из моего рабочего потока в вызывающем потоке ? Под «вызывающим потоком» я подразумеваю поток, который создал мой рабочий поток, а не сам рабочий поток. Например, на Android я бы сделал следующее (что вызвало бы это в главном потоке пользовательского интерфейса, также приемлемое решение):

    Message.obtain(m_messageHandler, message, null).sendToTarget();

Я нашел AsyncCallback . Это делает то, что мне нужно? У кого-нибудь есть пример? Не очень понятно, какой поток вызывает процедуру обратного вызова.

4, На Android рабочий поток может сделать wait (), чтобы сделать паузу, пока вызывающий поток не вызовет interrupt (). Это похоже на Event и WaitForObject () в win32. Например на 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 ]

3 голосов
/ 23 августа 2011

Другой способ запустить что-то в другом потоке -

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

Мне кажется, что этот синтаксис проще, чем создавать Thread.

Чтобы вернуться к потоку пользовательского интерфейса, который необходим для создания антинга, который будет обновлять пользовательский интерфейс, вам нужен дескриптор Dispatcher. Самый простой способ получить следующий:

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

Вы не можете wait на WP7. Вам нужно работать с обратными вызовами, событиями или Reactive Extensions. Через API есть несколько способов, с помощью которых вы можете написать ожидающий код, но он просто заблокирует приложение, и ожидание предотвратит выполнение кода, который он ожидает.

1 голос
/ 23 августа 2011

Silverlight-эквивалент события Win32 - либо ManualResetEvent, либо AutoResetEvent, в зависимости от ваших потребностей.

Поскольку Ричард, возможно, пыталсяПредполагается, что класс Monitor также обеспечивает аналогичную семантику ожидания / сигнала.Однако я склонен думать о мониторе как о контроле доступа к ресурсу, в то время как события просто дают вам понять, что что-то произошло.

0 голосов
/ 25 августа 2011

В конце концов вы должны проверить класс BackgroundWorker .Я думаю, что это то же самое, что и класс AsyncTask в Android.BackgroundWorker содержит два события: одно вызывается для выполнения работы в другом потоке, а завершенное событие вызывается в потоке пользовательского интерфейса.

var worker = new BackgroundWorker();
worker.DoWork += delegate { ... };
worker.RunWorkerCompleted += delegate { ... };
worker.RunWorkerAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...