在C#中为什么使用委托允许线程访问表单对象(如TextBoxes)

时间:2012-10-28 07:43:05

标签: c# visual-studio-2010

根据我的阅读,代表的定义是:

  

委托是引用方法的类型。一旦代表是   分配了一个       方法,它的行为与该方法完全相同。可以使用委托方法       像任何其他方法一样,带参数和返回值。

现在我知道如何写表单对象说使用委托通过线程的文本框但是我无法理解委托中解决的方法如何访问 表单上的所有对象。如果有人能清楚这一点,我将不胜感激。

编辑: 现在我将如何创建一个委托

public delegate void MyDelegate(string str,int str2);

void main()
{
Thread t = new Thread(RunInThread); //Method that will run in a separate thread
t.Start();
}
void RunInThread ()
{
MyDelegate delInstatnce = new MyDelegate(AddControl); //Attach a method
this.Invoke(delInstatnce,"First Parameter",1001);
}
void AddControl(string str,int str2)
{
  //Why could you access all the form components from here ?
}

1 个答案:

答案 0 :(得分:2)

首先,这是对代表的非常困惑的描述。您可能会发现my article on delegates and events更有帮助。

其次,鉴于标题和正文谈论不同的事情,你的问题是不是很清楚。

委托实际上只是一个对象,它封装了在类中调用方法的想法。该方法的可访问性在委托创建时控制,而不是在执行时控制 - 例如,类中的代码可以创建一个引用私有方法的委托,并且该委托可以返回到类外部的代码...当它被调用时,调用私有方法。就访问而言,这仍然是“安全的”,因为只允许访问私有方法的代码创建委托实例。在私有方法中,代码可以以正常方式访问所有其他成员。

现在你的标题谈论线程......并且使用委托不会实际上允许你从非UI线程访问UI元素。但是,它允许您使用类似Control.InvokeDispatcher.Invoke的内容,每个调用UI线程上的委托实例。所以你基本上说,“我需要运行一些代码,但我想在正确的线程上运行它 - 请为我做。”委托就是您传达要在UI线程上运行的代码的方式。

希望有所帮助。请随意提出更具体的说明。