2015-02-11 4 views
-3

Мне нужно заполнить древовидную структуру из моей файловой системы. и мой код работает без проблем. Однако, когда я пытаюсь заполнить диск «C», это занимает много времени. Поэтому я решил использовать BackroundWorker. Проблема: я получаю это исключение ниже.Путаница о том, как реализовать BeginInvoke

Действие, выполняемое этим элементом управления, вызывается из неправильной резьбы. Маршал к правильной теме, используя Control.Invoke или Control.BeginInvoke для выполнения этого действия.

Я искал решение и добавить это заявление

CheckForIllegalCrossThreadCalls = false

Оно не worked.So Я искал для программирования асинхронная и пытался реализовать начать Invoke я coudnt сделать это сейчас я больше запутывается

+1

Я не совсем понимаю вопрос. Является ли проблема обновлением 'Control' из другого потока? – Codor

+2

Как вы пытались внедрить 'BeginInvoke'? –

+2

BackgroundWorker совсем не поможет. Загрузка большого количества данных в пользовательский интерфейс всегда происходит в потоке пользовательского интерфейса. Кроме того, это * загрузка * занимает много времени. Там, где вы его запускаете, все равно потребуется много времени. Уменьшите объем данных, которые вы загружаете, используя технологии виртуализации, загружая узлы * только *, когда древовидная структура расширяется и т. Д. –

ответ

0

Вы можете использовать следующий метод расширения для более или менее автоматического переключения потока.

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); 
+0

Это, однако, не устранит настоящую проблему. –

+1

Я не понимаю вашего комментария. Я что-то упускаю? – Codor

+1

Реальная проблема OP заключается в загрузке большого количества данных в дерево, большинство из которых даже не отображаются. Попытка сделать это из другого потока будет только замедлять работу. В лучшем случае он не будет замораживать пользовательский интерфейс, но только если каждый узел загружен отдельным BeginInvoke (с соответствующими служебными данными). Если все данные загружаются сразу, пользовательский интерфейс все равно будет зависеть –

Смежные вопросы