Monotouch: службы UIAlertView и WCF, отладчик. StackTrace - PullRequest
1 голос
/ 24 марта 2011

В настоящее время я использую WCF в monotouch для вызова существующей службы и пользовательского UIAlertView.

Проблема заключается в том, что если я создаю UIAlertView в качестве экземпляра класса и я делаю следующее:

public override void ViewDidAppear()
{
 _alertView.Message = "Loading...";
 _alertView.Show();

 _client.GetDataAsync("test");
 _client.GetDataCompleted += GetDataCompletedDelegate;

 base.ViewDidAppear();
}

void GetDataCompletedDelegate(object sender, GetDataEventArgs)
{
 // do someting with data
 _alertView.Hide();
}

это работает, но этот совет записан в консоли: UIAlertView: wait_fences: не удалось получить ответ: 10004003

иначе, если я попытаюсь запустить этот код:

public override void ViewDidAppear()
{
 using(CustomAV _alertView = new CustomAV())
 {
   _alertView.Message = "Loading...";
   _alertView.Show();

   _client.GetDataAsync("test");
   _client.GetDataCompleted += delegate{ 
     InvokeOnMainThread(delegate{
      // do someting with data
      _alertView.Hide();
     });
  };
 }

 base.ViewDidAppear();
}

при первом запуске кода, но теперь отображается предупреждение.Второй раз симулятор не запускается. Не удалось зарегистрировать com.yourcompany.wcftest на сервере начальной загрузки.Ошибка: неизвестный код ошибки.Как правило, это означает, что другой экземпляр этого процесса уже запущен или завис в отладчике. StackTrace. В этом случае мне нужно перезагрузить компьютер.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Спасибо, Джефф, я проверил свой код и в GetDataCompletedDelegate я вставил функцию, которая запускается в потоке пользовательского интерфейса.

InvokeOnMainThread(delegate{
 doSomething();
});

private void doSomething()
{
 // do stuff here
 _alertView.Hide();
}

Ошибка fency продолжает появляться.Если я использую ваше решение внутри метода doSomething (), оно работает

_alertView.InvokeOnMainThread(delegate{
 _alertView.Hide();
});

Почему?Может быть, я не понял, но в первом фрагменте кода сделать что-то () работает в потоке пользовательского интерфейса!Не правда ли?

1 Ответ

1 голос
/ 24 марта 2011

У вас есть 2 отдельные проблемы.

1: _alertView.Hide () не работает в потоке пользовательского интерфейса (именно это вызывает ошибку заборов)

2: во второйНапример, вы удаляете UIAlertVeiw сразу после его создания, но у вас есть делегат экземпляра.Это приводит к аварийному завершению среды выполнения, а затем, когда вы запускаете ее снова, поскольку старый сбойный процесс все еще работает, симулятор не позволит запустить второй экземпляр.делегат {_alertView.Hide ();});

...