Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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#_Multithreading_Delegates - Fatal编程技术网

C#代表混乱和缺乏知识

C#代表混乱和缺乏知识,c#,multithreading,delegates,C#,Multithreading,Delegates,我对代表们感到很困惑,我的大脑会自己吃东西 我想把两个不同的线程连接起来,互相做一些事情。 但是很明显,“跨线程调用是不安全的”异常到处都是,要求我提供代理。我读过无数的教程,文档,例子,每个例子我只会死得更多一些,因为我尝试过,它根本不起作用 以下是我的简化设置,无需编写代码: 我有两条线 THREAD1具有类显示功能,并带有RICHTEXTBOX 该类有一个富文本框,我将对其进行编辑 该类有一个方法int WRITE\u TO\u TEXTBOX\u和返回\u反馈(字符串文本) 螺纹2具

我对代表们感到很困惑,我的大脑会自己吃东西

我想把两个不同的线程连接起来,互相做一些事情。 但是很明显,“跨线程调用是不安全的”异常到处都是,要求我提供代理。我读过无数的教程,文档,例子,每个例子我只会死得更多一些,因为我尝试过,它根本不起作用

以下是我的简化设置,无需编写代码:

我有两条线

THREAD1具有类显示功能,并带有RICHTEXTBOX

该类有一个富文本框,我将对其进行编辑

该类有一个方法int WRITE\u TO\u TEXTBOX\u和返回\u反馈(字符串文本)

螺纹2具有类控制面板

该类有一个“厄运”文本框,其中包含一些文本

该类有一个按钮\u OF_MAGIC,它将调用另一个类中的方法,将文本框的文本添加到richtextbox。在执行该方法后,该方法将返回一个int,其中包含富文本框文本的新总大小

我的问题是,我不知道如何使这个结构成为最整洁的

  • 我是否通过委托或其他方式显式地操纵控件,使THREAD2升级到THREAD1,从而使代码易于输入/输出
  • 我是否调用一个方法来为我进行编辑,这将使THREAD1类依赖于THREAD2类
  • 以及如何实际构建委托。每次我在任何地方尝试任何东西时,代码都会抱怨委托只能用于静态的,但这对于我要创建的东西来说是非常不切实际的。我可以通过在THREAD1中生成一些变量来解决这个问题,从THREAD2编辑它们,让THREAD1知道如何处理这些变量,从而从THREAD2>THREAD1传递所有交互。但这让我的THREAD1代码变得如此凌乱和不整洁,我想哭

    有没有另一种从THREAD2->THREAD1调用函数的方法,这种方法很简洁,不涉及变量和自定义线程锁定代码,以管理变量和其他东西

    我希望我能理解我的意思

    我只想喝一杯 THREAD1>CLASS1>富文本框

    我可以使用THREAD2>CLASS2>按钮进行编辑 这样我就不会在THREAD1>CLASS1中编辑任何内容

    我的目标是使THREAD2成为程序的一个完整插件,使依赖关系仅为单向(THREAD2依赖于Thread1,而Thread1并不期望它)

    如果让Thread1忽略Thread2是不可能的,那么我至少可以让Thread1的参与最小化吗

    编辑:如果代理和其他相关的东西不是我要找的,我要找的是什么,如果我想让独立的代码片段在各自的线程中运行,彼此独立,但相互干扰以实现更大的目标;比如他们以任何方式互相编辑;,所以 1.我开发了“类我的程序”来独立运行,之后我制作了一个插件 2.“给我的插件分类”,不管它想怎么处理我的程序,而不需要返回并编辑我的程序代码来允许两个程序之间的通信。
    如果C#做不到,有没有一种编程语言可以实现这一点呢?

    这就是我在表单应用程序中用来在线程之间切换并更改UI控件的方法

    Program.MainForm.Invoke((MethodInvoker)delegate {
    
        //do changes here  
    
    });'
    

    一个程序在多个线程上有UI是非常罕见的。你为什么需要这个?把所有的东西移到一个UI线程上。我不可能做到这一点。第二个UI线程做它自己的事情,在我的例子中,作为一个服务器。它需要尽快回复,并将事情记录回UI,而UI也需要快速响应。我不希望服务器类仅仅为了绘制一个愚蠢的UI而失去性能。它只是试图将数据传递给UI,而UI不会“过于复杂”以避免性能损失(例如来自另一个线程的简单方法调用;没有其他废话),但数据锁定使其变得不可能;如何禁用数据锁定?令人惊讶。您的第二个UI线程如何同时成为“服务器”?您不应该阻止UI线程,因为这会使UI挂起。难道你不能让一个UI线程和其他线程来完成大部分工作(比如运行“服务器”)吗?UI控件只能在UI线程上访问,因为EnySign else将是快速的。