Как запустить код в главном потоке после асинхронного - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть код, который будет выполняться только в основном потоке, но прежде чем этот код сможет работать, мне нужно инициализировать объект. В любом случае я могу заставить асинхронный код выполнять синхронизацию? Функции после ожидания - это вызовы API, и поэтому я не могу изменить их напрямую.

    public partial class MainWindow : Window
    {
        private MustBeInit mbi;

        public MainWindow() {
            InitializeComponent();
            // async code that initializes mbi
            InitMbi(); 
            // mbi must be done at this point
            SomeCodeThatUsesMbi();
        }

        public async void InitMbi() {
            mbi = new MustBeInit();
            await mbi.DoSomethingAsync();
            await mbi.DoSomethingElseAsync();

            // is there any way i can run these two methods as not await and
            // run them synchronous?
        }

        public void SomeCodeThatUsesMbi() {
            DoSomethingWithMbi(mbi); // mbi cannot be null here
        }
    }

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы не можете использовать await в конструкторах, но вы можете поместить все это в асинхронный обработчик событий, подписанный на событие Loaded Window:

public MainWindow()
{
   this.Loaded += async (s, e) => 
   {
        await InitMbi(); 
        // mbi must be done at this point
        SomeCodeThatUsesMbi();
   };

   InitializeComponent();
}

И не забудьте изменить возвращаемое значение вашего InitMbi() на Task:

public async Task InitMbi()
0 голосов
/ 01 ноября 2018
// is there any way i can run these two methods as not await and
// run them synchronous?

Да, просто удалите await перед вызовом метода, например:

public async void InitMbi() {
    mbi = new MustBeInit();
    mbi.DoSomethingAsync();
    mbi.DoSomethingElseAsync();

    // is there any way i can run these two methods as not await and
    // run them synchronous?
}

Но учтите, что это заблокирует ваш главный поток!

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