异步等待,直到加载表单继续

时间:2014-08-25 20:22:49

标签: c# task

我正在尝试让我的表单等到我的_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。有没有办法通过这段代码获得我需要的功能?

1 个答案:

答案 0 :(得分: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");
    }
}