等待异步任务后的变量重置

时间:2016-05-13 01:54:30

标签: c# winforms async-await

我有一个Windows窗体应用,其中表单的代码包含:

public partial class Form1 : Form
{
    bool testBool;

    public Form1()
    {
        InitializeComponent();
    }

    private async void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            await new Form1().Run();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }

        Console.WriteLine(testBool);
    }

    private async Task Run()
    {
        Console.WriteLine(testBool);
        testBool = true;
        Console.WriteLine(testBool);
    }
}

我注意到的是我在控制台中获得的结果是

false
true
false

我希望它在哪里

false
true
true

在此过程中testBool发生了什么?有没有办法可以在Run()完成后保留此变量的值?

2 个答案:

答案 0 :(得分:1)

testBool是一个实例字段,每个Form1都有不同的字段。如果您希望他们共享相同的testBool字段,请将其标记为static

public partial class Form1 : Form
{
    static bool testBool;
}

静态(C#参考)

  

使用static修饰符声明一个静态成员,属于该类型本身而不是属于特定对象。 static修饰符可以与类,字段,方法,属性,运算符,事件和构造函数一起使用,但不能与索引器,析构函数或类以外的类型一起使用。有关更多信息,请参见静态类和静态类成员(C#编程指南)。

答案 1 :(得分:1)

正如您对问题的评论中所述,您正在访问Form1课程的两个不同实例。

您正在实例化一个新的Form1并调用该新对象的Run方法,该方法将打印出false然后true,然后当它从中返回时,它会将Form1的原始testBool实例值写为false

您可能希望将您的类定义为static,或至少提供公共静态字段,或私有静态与公共静态字段访问器属性或函数。