C# Winforms构造函数时间序列错误?
我有以下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
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();
}