Как вызвать конструктор базового класса в отдельном потоке пользовательского интерфейса

#c# #ios #xamarin #constructor #uiviewcontroller

#c# #iOS #xamarin #конструктор #uiviewcontroller

Вопрос:

Я нахожусь в ситуации, когда мой конструктор базового класса необходимо вызвать в отдельном потоке (т.е. UIThread). Я ожидаю чего-то похожего на InvokeOnMainThread(base()); вместо base()

 Class BaseClass{
}

Class DerivedClass : BaseClass
{
   public DerivedClass : base()
   {
      ## Constructor
    }
}
  

Пожалуйста, предложите мне какое-либо решение или обходной путь для этого сценария.

Комментарии:

1. это странное требование. Как возник этот сценарий? Возможно, ваша фактическая основная проблема — это проблема дизайна в вашей структуре кода. Трудно понять без дополнительного контекста. Но я сильно чувствую проблему X-Y.

2. Позвольте мне объяснить сценарий. у нас есть класс, который запускается не из потока пользовательского интерфейса, но использует UIViewController в качестве базового класса. когда мы пытаемся создать экземпляр UIViewController из фонового потока, он выдает исключение UIKit. Для этого нам нужно вызвать конструктор UIViewController в UIThread.

3. почему класс должен наследовать от класса пользовательского интерфейса, если он не выполняется как часть пользовательского интерфейса? На первый взгляд, это не имеет большого смысла. Что на самом деле делает класс?

Ответ №1:

когда мы пытаемся создать экземпляр UIViewController из фонового потока

К сожалению, мы не можем создать экземпляр объекта UIKit в потоке, отличном от пользовательского интерфейса, и мы также не можем использовать экземпляр UIKit.

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

Сообщение об ошибке покажет что-то вроде следующего:

введите описание изображения здесь

Чтобы исправить эти проблемы, обычно мы будем использовать InvokeOnMainThread метод.

 InvokeOnMainThread ( () => {
    // manipulate UI controls
});
  

В противном случае вы можете отправить сообщение в UIThread для удовлетворения ваших потребностей. Например, с помощью MessagingCenter .