繁体   English   中英

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

[英](A)wait for class to finish instantiate

我尝试等待类实例化结束。 我的架构如下。 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;
    }

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

cook.Init()需要await

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

CookchiefInit() ,需要await CookHelperInit()调用:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM