Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# 关于如何实现BeginInvoke的困惑_C# - Fatal编程技术网

C# 关于如何实现BeginInvoke的困惑

C# 关于如何实现BeginInvoke的困惑,c#,C#,我需要从我的文件系统结构中填充treeview。我的代码工作没有任何问题。但是,当我尝试填充Cdrive时,这需要很多时间。因此我决定使用BackroundWorker。问题是,我在下面遇到了此异常 正在对此控件执行的操作是从错误的线程调用的。使用Control.Invoke或Control.BeginInvoke封送到正确的线程以执行此操作 我已搜索解决方案并添加此声明 CheckForIllegalCrossThreadCalls=false 它不起作用。因此,我搜索了Asyncron编程并

我需要从我的文件系统结构中填充treeview。我的代码工作没有任何问题。但是,当我尝试填充Cdrive时,这需要很多时间。因此我决定使用BackroundWorker。问题是,我在下面遇到了此异常

正在对此控件执行的操作是从错误的线程调用的。使用Control.Invoke或Control.BeginInvoke封送到正确的线程以执行此操作

我已搜索解决方案并添加此声明

CheckForIllegalCrossThreadCalls=false


它不起作用。因此,我搜索了Asyncron编程并尝试实现begin invoke,但现在我做不到。我更困惑了

您可以使用以下扩展方法或多或少地自动切换线程

public static void InvokeIfRequired(this ISynchronizeInvoke iSyncInvoke, Delegate iAction, object[] args = null)
{
    if (iSyncInvoke.InvokeRequired)
        iSyncInvoke.Invoke(iAction, args);
    else
        iAction.DynamicInvoke(args);
}
然后,您可以对控件使用此扩展方法在正确的线程上调用委托,如下所示

Control SomeControl;
Action iAction = () =>
{
    // do something with control
}
SomeControl.InvokeIfRequired(iAction);

我不太明白这个问题。从另一个线程更新控件有问题吗?您是如何尝试实现BeginInvoke的?BackgroundWorker根本帮不了您。向UI控件加载大量数据总是发生在UI线程上。此外,装载需要花费大量时间。无论你在哪里运行它,它仍然需要很多时间。相反,使用虚拟化技术减少加载的数据量,仅在treeview扩展时加载节点等等。您应该问的问题是,为什么需要这么长时间?您为每个项目加载的内容是什么?是否可以提高效率。您是否可以在打开每个节点时加载整个驱动器?您的TreeView支持数据绑定吗?此类控件通常还支持数据虚拟化和/或延迟加载。你在使用哪个控件?但这并不能解决真正的问题。我不理解你的评论。我遗漏了什么吗?OP真正的问题是将大量数据加载到树状视图,其中大部分甚至不会显示。尝试从另一个线程执行此操作只会使其速度变慢。充其量,它不会冻结UI,但前提是每个节点都加载了具有相应开销的单独BeginInvoke。如果同时加载所有数据,UI仍将冻结