首页 > 解决方案 > 异步后如何在主线程上运行代码

问题描述

我的代码只能在主线程上运行,但在该代码可以运行之前,我需要初始化一个对象。无论如何我可以强制异步代码运行同步吗?等待之后的函数是 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
        }
    }

标签: c#wpfasynchronous

解决方案


您不能在构造函数中使用 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()

推荐阅读