Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 我的处理线程对于我的UI线程来说太快了_C#_Multithreading_Backgroundworker_Synchronize - Fatal编程技术网

C# 我的处理线程对于我的UI线程来说太快了

C# 我的处理线程对于我的UI线程来说太快了,c#,multithreading,backgroundworker,synchronize,C#,Multithreading,Backgroundworker,Synchronize,我有一个C#程序,它正在检查文件和注册表项是否存在,并在表单上使用AppendText()。Textbox查找每个文件和注册表项 这是在一个异步的BackgroundWorker中运行的,现在我的后台工作人员实际处理速度非常快,以至于我的UI线程被AppendText命令阻塞,程序崩溃。如何同步BackgroundWorker和UI线程,使BackgroundWorker在UI线程准备就绪之前不会再次开始处理?想到的一种方法是将命令排队,并允许UI线程以自己的速度处理它们::IE创建一个通用列表

我有一个C#程序,它正在检查文件和注册表项是否存在,并在
表单上使用
AppendText()
。Textbox
查找每个文件和注册表项


这是在一个异步的
BackgroundWorker
中运行的,现在我的后台工作人员实际处理速度非常快,以至于我的UI线程被
AppendText
命令阻塞,程序崩溃。如何同步
BackgroundWorker
和UI线程,使
BackgroundWorker
在UI线程准备就绪之前不会再次开始处理?

想到的一种方法是将命令排队,并允许UI线程以自己的速度处理它们::IE创建一个通用列表(我们称之为appendtext)在参数中,后台工作人员将添加到列表中,UI线程读取、调用,然后从列表中删除。您有一个
BackgroundWorker
,因此您拥有所需的一切。进度事件是在UI线程上调用的,因此如果工作线程以标准方式报告进度(通过调用并传递要追加的字符串作为第二个参数),则窗体的进度处理程序可以调用
AppendText
。后台线程将永远不会以这种方式运行UI

我怀疑您正在调用
BeginInvoke
来更新您的UI。另一种解决问题的方法是调用
Invoke


如果您让后台工作人员保存10行代码,然后立即将它们全部传递给进度事件,您可以做得更好。这将减少更新的开销,并使您的后台线程处理得更快。

您能给我们看一些代码吗?我不明白您所说的有什么意义。您尝试绑定到数据了吗您尝试了System.Windows.Forms.Control.Invoke方法?可能是一个WaitHandle…如果您想降低生产者线程的速度,提高消费者(UI)的速度,这也会很有用线程和正在显示的数据类型。或者更好;停止尝试一次更新一次,而是成批更新。这是一个好主意……将您想要做的更改加载到列表中,UI会在每个勾号更新列表中的所有内容:)是的,没错!进行微小的更新可能是问题的一大部分