正确使用取消

时间:2019-07-25 06:21:59

标签: c# async-await

考虑一个简单的场景:我有3种形式。 Form1有一个显示Form2的按钮; Form2依次具有一个打开Form3的按钮。

最初的目标:

  1. 在程序启动时,显示Form1并开始为Form2加载数据。
  2. 让用户单击按钮以打开Form2,即使尚未完成数据加载(对于任一表单)。
  3. 与Form2相同,在Form2上显示开始加载Form3的数据,并且即使Form2和Form3的数据尚未完成加载,也让用户单击按钮以显示Form 3。

我(认为?)是这样实现的(Task.Delay模拟了一些数据加载):

Form1

public partial class Form1 : Form
{
    private Form2 form2 = new Form2();

    public Form1()
    {
        InitializeComponent();
    }

    public async Task Init()
    {
        await Task.Delay(5000);
        MessageBox.Show("Form1 data load finished");
    }

    private async void Form1_Load(object sender, EventArgs e)
    {
        await Task.WhenAll(form2.Init(), Init());
        MessageBox.Show("Form2 prepared, form1 finished loading");
    }

    private void Button1_Click(object sender, EventArgs e)
    {
        form2.Show();
    }
}

Form2

public partial class Form2 : Form
{
    private Form3 form3 = new Form3();

    public Form2()
    {
        InitializeComponent();
    }

    public async Task Init()
    {
        await Task.Delay(5000);
        MessageBox.Show("Form2 data load finished");
    }

    private void Button1_Click(object sender, System.EventArgs e)
    {
        form3.Show();
    }

    private async void Form2_Load(object sender, System.EventArgs e)
    {
        await form3.Init();
        MessageBox.Show("Form3 prepared");
    }
}

Form3

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }

    public async Task Init()
    {
        await Task.Delay(5000);
        MessageBox.Show("Form3 data load finished");
    }
}

问题:

我想在所示的Form3上取消由Form1完成的任何数据加载,处置该数据并关闭它。我看到了CancellationToken,但不确定如何在这里使用它。

0 个答案:

没有答案