(A) дождаться окончания класса - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь дождаться окончания класса с помощью экземпляра. Моя архитектура следующая. Кук является неотъемлемой частью CookChief. И если я создаю экземпляр cook, CookChief создает сам, но CookChief вызывает 1 другой класс с именем Cookhelper, cookhelper ждет ввода, и для этого метода ввода я хочу ждать в Cook. Дело в том, что я создаю это в MVVM Galasoft, и моя точка входа - это CookViewmodel, с relaycommand.

В коде ниже вы можете увидеть мою архитектуру. Короче говоря, я хочу подождать, пока этот bool не будет обработан = await 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 Ответ

1 голос
/ 13 апреля 2019

Согласно обсуждению в комментариях, проблема заключалась в том, что процедура инициализации смешивала синхронные и асинхронные методы и вызовы.Кроме того, некоторые методы async были вызваны без ключевого слова await.Решением было сделать все вызовы асинхронными и await их.

cook.Init() нуждается в await:

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

В CookchiefInit() вызов CookHelperInit() долженbe await ed:

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

Чтобы await CookHelperInit(), его необходимо сделать асинхронным.Вызов startProc() относится к методу async, поэтому его также следует ожидать:

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