Dispatcher.Invoke () на Windows Phone 7? - PullRequest
4 голосов
/ 04 ноября 2011

В методе обратного вызова я пытаюсь получить текстовое свойство textBox следующим образом:

string postData = tbSendBox.Text;

Но так как он не выполняется в потоке пользовательского интерфейса, он дает мне исключение между потоками.

Я хочу что-то вроде этого:

Dispatcher.BeginInvoke(() =>
{
    string postData = tbSendBox.Text;
});

Но это работает асинхронно. Синхронная версия:

Dispatcher.Invoke(() =>
{
    string postData = tbSendBox.Text;
});

Но Dispatcher.Invoke () не существует для Windows Phone. Есть ли что-то эквивалентное? Есть ли другой подход?

Вот вся функция:

public void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        Stream postStream = request.EndGetRequestStream(asynchronousResult);

        string postData = tbSendBox.Text;

        // Convert the string into a byte array.
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);

        // Write to the request stream.
        postStream.Write(byteArray, 0, postData.Length);
        postStream.Close();

        // Start the asynchronous operation to get the response
        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    }

Ответы [ 3 ]

9 голосов
/ 04 ноября 2011

Нет, вы правы, вы можете получить доступ только к асинхронному.Зачем вам нужна синхронизация, поскольку вы находитесь в другом потоке пользовательского интерфейса?

Deployment.Current.Dispatcher.BeginInvoke(() =>
       {
            string postData = tbSendBox.Text;
        });
2 голосов
/ 04 ноября 2011

Это должно сделать асинхронный вызов синхронного:

  Exception exception = null;
  var waitEvent = new System.Threading.ManualResetEvent(false);
  string postData = "";
  Deployment.Current.Dispatcher.BeginInvoke(() =>
  {
    try
    {
      postData = tbSendBox.Text;
    }
    catch (Exception ex)
    {
      exception = ex;
    }
    waitEvent.Set();
  });
  waitEvent.WaitOne();
  if (exception != null)
    throw exception;
0 голосов
/ 30 ноября 2012

1) Получить ссылку на контекст синхронизации потока пользовательского интерфейса. Например,

SynchronizationContext context = SynchronizationContext.Current

2) Затем опубликуйте обратный звонок в этом контексте. Вот как внутренне работает Диспетчер

context.Post((userSuppliedState) => { }, null);

Это то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...