C# Winforms构造函数时间序列错误?

C# Winforms构造函数时间序列错误?,c#,winforms,C#,Winforms,我有以下Winforms层次结构 Form ==> AForm ==> BForm 并且有一个空的可启用成员int?X在FormA中定义。在表格b中,有以下代码 public partial class FormA: Form { public int? X { get; set; } public FormA(int? x) { X = x } .... public partial class FormB: FormA, IFormAView { pu

我有以下Winforms层次结构

Form ==> AForm ==> BForm
并且有一个空的可启用成员
int?X
FormA
中定义。在
表格b
中,有以下代码

public partial class FormA: Form
{
    public int? X { get; set; }
    public FormA(int? x) { X = x }
....

public partial class FormB: FormA, IFormAView
{
    public FormB()
    {
        AsyncCall(() => 
        {
            int z = X ?? 0;
            System.Diagnostics.Debug.WriteLine("X: " + X.ToString() + " z: " + z.ToString());
            return z;
        }

public static T GetForm<T>(int? x)
{
    T form = new T();
    form.X = x;
    form.Show();
}
GetForm<FormB>(100);
甚至调试也显示FormA:X不是零。

在FormA中,X是一个int属性,默认为
null
。您从未从
public FormB()
构造函数调用
public FormA(int?x)
基构造函数,因此x从未设置为任何其他值

由于在调用FormB的构造函数(调用AsyncCall)后设置了X的值,因此会遇到时间问题,因为AsyncCall可能在设置
form.X=X之前或之后完成在GetForm函数中

如果希望AsyncCall仍然是AsyncCall,则应按如下方式更新FormB()的构造函数:

公共表格B(int?x):基数(x) { //

然后更新GetForm,如下所示(注意where子句,这让我们知道T至少是从a派生的,所以它有一个接受int的构造函数?)

公共静态T GetForm(int?x),其中T:FormA
{
T形式=新的T(x);
form.Show();
} 
在FormA中,X是一个int属性,默认为
null
。您永远不会从
public FormB()
构造函数调用
公共FormA(int?X)
基构造函数,因此X永远不会被设置为其他任何值

由于在调用FormB的构造函数(调用AsyncCall)后设置了X的值,因此会遇到时间问题,因为AsyncCall可能在GetForm函数中设置
form.X=X;
之前或之后完成

如果希望AsyncCall仍然是AsyncCall,则应按如下方式更新FormB()的构造函数:

公共表格B(int?x):基数(x) { //

然后更新GetForm,如下所示(注意where子句,这让我们知道T至少是从a派生的,所以它有一个接受int的构造函数?)

公共静态T GetForm(int?x),其中T:FormA
{
T形式=新的T(x);
form.Show();
} 

您正在调用另一个线程上的代码来测试X(使用AsyncCall和“X??”),在FormA构造函数中指定X之前或之后,可能会运行代码,也可能不会运行代码


i、 e.如果您停止使用AsyncCall,您应该会得到一致的结果。

您正在调用另一个线程上的代码来测试X(使用AsyncCall和“X??”),在FormA构造函数中分配X之前或之后,代码可能会运行,也可能不会运行


i、 e.如果您停止使用AsyncCall,您应该会得到一致的结果。

您的
FormB(int)
构造函数在哪里?上面的代码中没有列出它,并且这可能不会校准您的无参数
FormB()
constructor,或者它不调用基构造函数。我已经更新了这个问题。表单是使用静态方法创建的。您的
FormB(int)
constructor在哪里?它没有列在上面的代码中,并且可能没有调用无参数
FormB()
constructor,或者它不调用基构造函数。我已经更新了问题。表单是使用静态方法创建的。现在很明显,您正在调用FomrB构造函数(这将启动异步调用)。然后调用
form.X=X;
。根据异步调用完成的速度,它在处理X时可能有值,也可能没有值。现在很明显。您正在调用FomrB构造函数(启动异步调用)。然后调用
form.X=X;
。根据异步调用完成的速度,它在处理X时可能有值,也可能没有值。
    X:  z: 0
public static T GetForm<T>(int? x) where T : FormA
{
     T form = new T(x);
     form.Show();
}