Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,为什么使用委托允许线程访问表单对象(如文本框)_C#_Visual Studio 2010 - Fatal编程技术网

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

在C#中,为什么使用委托允许线程访问表单对象(如文本框),c#,visual-studio-2010,C#,Visual Studio 2010,据我所知,代表的定义是: 委托是引用方法的类型。一旦委托人被任命 指派 方法,它的行为与该方法完全相同。可以使用委托方法 与任何其他方法一样,具有参数和返回值 现在我知道了如何使用委托通过线程写入表单对象(比如文本框),但是我无法理解委托中的方法是如何访问的 窗体上的所有对象。如果有人能澄清此事,我将不胜感激 编辑: 现在,我将如何创建一个委托 public delegate void MyDelegate(string str,int str2); void main() { Thread

据我所知,代表的定义是:

委托是引用方法的类型。一旦委托人被任命 指派 方法,它的行为与该方法完全相同。可以使用委托方法 与任何其他方法一样,具有参数和返回值

现在我知道了如何使用委托通过线程写入表单对象(比如文本框),但是我无法理解委托中的方法是如何访问的 窗体上的所有对象。如果有人能澄清此事,我将不胜感激

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

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 ?
}

首先,这是一个相当混乱的代表描述。你可能会发现更有帮助

第二,你的问题是关于什么的还不太清楚,因为标题和正文谈论的是不同的事情

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

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


希望有帮助。请随意要求更具体的澄清。

人们需要停止对问题进行否决,因为提问者对问题的前提感到困惑。@Casper_2211:现在还不清楚线程是从哪里来的,但我回答的这一部分可能是最直接相关的:“在私有方法中,代码以正常方式访问所有其他成员。”为什么您希望私有方法不能访问所有内容?感谢您的回答,如果我写了类似于
some_textbox.text=“ABC”的内容,请让我重新表述我的问题“
内部
RunInThread
它不会工作。为什么我必须在这里使用委托来访问表单控件?@Casper_2211:这是我回答的第二部分:除了在UI线程中,你不能访问UI组件,你可以使用委托提供一种方式来告诉
控件。调用
你想在UI线程中执行的代码。