在Compact Framework中的子窗体的showdialog中调用父窗体的方法导致ThreadAbortException

时间:2013-09-03 21:48:34

标签: c# .net compact-framework invoke

我正在从父表单调用表单的ShowDialog,我正在填充子表单中的一些数据,我希望通过该表单调用父表单中的方法。

我父表单中的方法更新了表单中的控件值。

这导致我一个线程异常

说像

ChildForm Cform=new ChildForm();
Cform.ShowDialog();

和ChildForm

ParentForm PForm=new Parentform();
PForm.Somemethod();//method in my parentForm

在某些方法中,我通过调用

更新表单中控件的值

我正在调用每个Control,但我仍然得到 ThreadAbort异常

注意:我使用的是Compact Framework

//My parent Form Method
       public void ProcessResponse()
        {

            Result Objresult = new Result();

            Objresult.ShowDialog();

        }

    //My child Form
      public void SendBackResponse()
      {
      //Some Processing
       ParentForm PForm=new Parentform();
        PForm.Somemethod();
      }

And In ParentForm I am having 

    public void Somemethod()
    {
        if(InvokeRequired)
        {
         //I am invoking Through the delegate
        }
    }

先谢谢

1 个答案:

答案 0 :(得分:1)

这里有一些问题。

首先,您的“父”表单不是调用ShowDialog的表单。您实际上是在Child中创建一个全新的Form实例,因此它与创建Child的Parent不同。

其次,ShowDialog为显示的Dialog创建一个单独的消息泵。发送到Parent的任何Windows消息都不会被处理,直到Dialog关闭并且主消息泵再次开始运行。这意味着在对话框关闭之前,父节点上的任何UI更新都不会发生。

第三,你所做的只是糟糕的设计。如果您需要Parent以某种UI方式对Child做出反应,那么在Child中公开一个属性,在Child关闭时读取它并处理更新:

class Child : Form
{
    ....
    public string NewInfo { get; set; }
}

....

// code in the Parent
var child = new ChildForm();
if(child.ShowDialog() == DialogResult.OK)
{
   this.UseChildData(child.NewInfo);
}

如果您没有更新父UI,而是运行某种形式的业务逻辑,那么您就违反了关注点的分离。将该业务逻辑放入Presenter / Controller / ViewModel / Service / Model /中,并将其传递给孩子。

class Service
{
    public void DoSomething() 
    {
        // business logic here 
    } 
}

class Child : Form
{
    Service m_service;

    public Child(Service service)
    {
        m_service = service;
    }

    void Foo()
    {
        // call the business logic
        m_service.DoSomething();
    }
}

....

// code in the Parent
var svc = new Service();
....
var child = new ChildForm(svc);
child.ShowDialog();