(A)等待课程完成实例化

时间:2019-04-13 12:37:37

标签: c# multithreading asynchronous task

我尝试等待类实例化结束。 我的架构如下。 Cook是CookChief的继承人。 如果我实例化cook,则CookChief会创建自己,但是CookChief会调用另一个名为Cookhelper的类,cookhelper正在等待输入,而我想在Cook中等待这种输入方法。 事情是iam在MVVM Galasoft中创建的,我的入口点是带有中继命令的CookViewmodel。

在下面的代码中,您可以看到我的体系结构。简而言之,我想等到这个布尔处理完毕后再等待Task.Run(()=> ValidateForDeviceId());完成。

我的第一步是外包每个类的构造函数。并创建一个init方法。 这是我的代码:

public CookViewModel()
    {
        startCookButtonCommand = new RelayCommand(Cook);
    }


    private async Task Cook()
    {
      cook.Init();
    }



public class Cook : CookChief
{
     public Cook()
    {

    }

    public async Task Init()
    {
      await this.CookChiefInit();
       //here I want to wait until CookChiefInit is finished
       Cooking();
    }

    public void Cooking()
    {
       MessageBox.Show("Input received");
    }
}

现在是厨师:

    public Cookchief()
    {

    }

    protected async Task CookchiefInit()
    {
        this.Cookhelper = new Cookhelper();
        Cookhelper.CookHelperInit();
    }

在CookHelper中,我们这样做:

    public CookHelper()
    {

    }

    public void CookHelperInit()
    {
        this.driverWindow = new DriverWindow();
        startProc();
    }

    private async void startProc()
    {
        ShowOrCloseDriverWindow(true);
        //this is the task what we wait for before we can repeat
        bool processed = await Task.Run(() => ValidateForDeviceId());
        if(processed)
        {
            ShowOrCloseDriverWindow(false);
        }
        else
        {
            MessageBox.Show("DriverError");
        }
    }

    private bool ValidateForDeviceId()
    {
        for (; ; )
        {
            this.deviceId = Input.deviceId;
            if (deviceId > 0)
            {
                break;
            }
        }
        return true;
    }

1 个答案:

答案 0 :(得分:1)

根据注释中的讨论,这里的问题是初始化例程混合了同步方法和异步方法以及调用。此外,某些async方法在没有await关键字的情况下被调用。解决方案是使所有调用异步并await

cook.Init()需要一个await

private async Task Cook()
{
    await cook.Init();
}

CookchiefInit()中,需要CookHelperInit()进行await呼叫:

protected async Task CookchiefInit()
{
    this.Cookhelper = new Cookhelper();
    Cookhelper.CookHelperInit();
}

await CookHelperInit(),必须使其异步。 startProc()调用是对async方法的,因此还必须等待它:

public async Task CookHelperInit()
{
    this.driverWindow = new DriverWindow();
    await startProc();
}