2013-10-03 2 views
0

У меня есть функция ShowPanel(Control ctrl), которая необходима для передачи Control в качестве параметра. Мне нужно вызвать эту функцию в фоновом рабочем потоке. Я использую следующий кодДоступ к управлению главной нитью в фоновой работе рабочего стола

void bw_DoWork(object sender,DoWorkEventArgs e) 
{      
    ShowPanel(listBox1);   
} 

Но терпит неудачу с execption

операции кросс-нить не действует: Control «Form1» доступ из нити, кроме резьбы она была создана на

Как я могу пройти listBox1 здесь в фоновом режиме?

+0

Если listbox1 создается на главном интерфейсе, необходимо вызвать функцию в progresschangedevent в BackgroundWorker. И вам нужно вызывать ReportProgress от участников опроса. –

ответ

3

serilize вызов, так как вы не можете получить доступ к элементу управления, который создан на другом потоке, необходимо seriliaze вызова с использованием ниже

void bw_DoWork(object sender,DoWorkEventArgs e) 
{      
    this.Invoke(new MethodInvoker(delegate { 

       ShowPanel(listBox1);   
    })); 
} 
+0

, делая это, Это не дает мне исключения, но все же функция ShowPanel (listBox1) 'вызвана только после завершения основного потока завершения его выполнения. –

0

Я предполагаю, что должно быть BeginInvoke вместо Invoke.

В противном случае это более общее решение.

Вам необходимо добавить ссылку на WindowsBase.dll.

На диспетчере главного потока ПОЛУЧИТЬ поток:

public class SomeClass 
{ 
    System.Windows.Threading.Dispatcher mainThreadDispatcher; 

    // assuming class is instantiated in a main thread, otherwise get a dispatcher to the 
    // main thread 
    public SomeClass() 
    { 
     Dispatcher mainThreadDispatcher = Dispatcher.CurrentDispatcher; 
    } 

    pubic void MethodCalledFromBackgroundThread() 
    { 
     mainThreadDispatcher.BeginInvoke((Action)({() => ShowPanel(listBox1);})); 
    } 
+0

Я использую .NET Framework 3.5. Он может работать в Framework 4.5 !!! –

+0

Дело диспетчера работает также в 3.5, см. Http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.currentdispatcher(v=vs.90).aspx – YM67549

+0

, но при добавлении ссылки на windowbase.dll он дает мне следующее предупреждение 'WindowBase.dll или одну из его зависимостей, требуемую более поздней версией .net framerwork, чем тот, который указан в проекте ...' –

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