1

我有以下 Winforms 层次结构。

Form ==> AForm ==> BForm

int? X;并且在 中定义了一个可以为空的成员FormA。在 中FormB,有以下代码。

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);

X从未被分配为空或零。我正在尝试关闭并打开表单FormB。偶尔z为零(可能每 10 次)。我设置了一个条件中断,它在z==0上线时中断return z

当击中断点时。调试写入

    X:  z: 0

即使调试显示 FormA:X 也不为零。

4

2 回答 2

3

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

即如果你停止使用 AsyncCall,你应该得到一致的结果。

于 2012-06-08T19:15:24.720 回答
2

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

由于您在调用 FormB 的构造函数(调用 AsyncCall)之后设置 X 的值,因此您将遇到时间问题,因为 AsyncCall 可能会在您form.X = x;在 GetForm 函数中设置之前或之后强制执行。

如果你希望你的 AsyncCall 仍然是一个 AsyncCall,你应该更新 FormB() 的构造函数如下:

公共 FormB(int?x) : base(x) { // ...

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

public static T GetForm<T>(int? x) where T : FormA
{
     T form = new T(x);
     form.Show();
} 
于 2012-06-08T18:47:17.427 回答