Асинхронное ожидание загрузки формы для продолжения

1

Я пытаюсь получить форму, чтобы подождать, пока какая-то часть моего метода _Load будет закончена, прежде чем продолжить. У меня есть несколько методов, которые являются асинхронными, но я не могу понять, почему я не могу заставить код ждать, пока fakeClickCheckUpdate будет закончен, прежде чем продолжить. Вот основные методы:

public myForm(string args)
{
    InitializeComponent();
    Load += myForm_Load;       
}

private void myForm_Load(object s, EventArgs e)
{
    this.fakeClickCheckUpdate();
    loadFinished = true;
    if (this.needsUpdate == true)
    {
        Console.WriteLine("Needs update...");
    }
    else
    {
        Console.WriteLine("update is false");
    }
}

public void fakeClickCheckUpdate()
{
    this.checkUpdateButton.PerformClick();
}

private async void checkUpdateButton_Click(object sender, EventArgs e)
{
    await startDownload(versionLink, versionSaveTo);
    await checkVersion();
    Console.WriteLine(needsUpdate);
}


private async Task checkVersion()
{
    string currVersion;
    string newVersion;
    using (StreamReader sr = new StreamReader(currVersionTxt))
    {
        currVersion = sr.ReadToEnd();
    }

    using (StreamReader nr = new StreamReader(versionSaveTo))
    {
        newVersion = nr.ReadToEnd();
    }

    if (!newVersion.Equals(currVersion, StringComparison.InvariantCultureIgnoreCase))
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            progressLabel.Text = "New version available! Please select 'Force Download'";
        });
        this.needsUpdate = true;

    }
    else
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            progressLabel.Text = "Your version is up-to-date. No need to update.";
        });
        this.needsUpdate = false;
    }


}

В принципе, я хочу, чтобы проверить текущую версию с помощью checkVersion и завершить ее, прежде чем она попытается продолжить использование loadFinished = true внутри myForm_Load. У меня есть checkVersion установить в качестве задачи асинхронном, так что нажатие кнопки можно использовать await на него. Есть ли способ получить необходимую мне функциональность с помощью этого кода?

  • 0
    Вы явно должны вызывать PerformClick ?
  • 0
    «Я установил checkVersion как асинхронную задачу, чтобы при нажатии кнопки можно было использовать await», - эта логика обратная. Вы await потому что что-то async Task , но почему это async Task а не просто void ?
Теги:
task

1 ответ

6
Лучший ответ

Во-первых, переместите код из своего действия с кликом.

private async void checkUpdateButton_Click(object sender, EventArgs e)
{
    await CheckForUpdate();
}

private async Task CheckForUpdate()
{
    await startDownload(versionLink, versionSaveTo);
    await checkVersion();
    Console.WriteLine(needsUpdate);
}

Затем вы можете вызвать эту функцию в своем OnLoad.

private async void myForm_Load(object s, EventArgs e)
{
    await CheckForUpdate();
    loadFinished = true;
    if (this.needsUpdate == true)
    {
        Console.WriteLine("Needs update...");
    }
    else
    {
        Console.WriteLine("update is false");
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню