Два потока общения - PullRequest
       0

Два потока общения

1 голос
/ 27 сентября 2011

У меня есть richTextBoxLog, который является публичным и статическим.

После того, как я объявил его, я запускаю новый поток, который инициализирует новую переменную с именем proba.richTextBoxLog должен получить значение из proba.

Проблема в том, что proba требуется время для инициализации, и я хочу, чтобы richTextBoxLog инициализировался, пока proba инициализируется.

Я хочу написать что-то вроде:

richTextBoxLogFile.richTextBoxLog.Text += proba;

Но, когда я пишу это в методе, который вызывается ранее упомянутым потоком, я получаю исключение: "Cross-thread operation not valid: Control 'richTextBoxLog' accessed from a thread other than the thread it was created on."

Могу ли я написать что-то вроде этого: остановить поток, затем инициализировать richTextBoxLog, затем снова запустить поток, затем остановить его, и то же самое продолжается, пока инициализация richTextBoxLog заканчивается.

Редактировать: я пытаюсь использоватьthis:

context.Post (new SendOrPostCallback (newMethod), (object) proba);

где context является контекстом основного потока, а newMethod инициализирует значение richTextBoxLog.Однако этот вызов находится в методе, который запускается новым потоком в цикле while:

   while (-1 != (ch = _reader.Read()))
        {
            Console.Write((char)ch);
            proba += ((char)ch).ToString();
            context.Post(new SendOrPostCallback(newMethod), (object)proba);                
        }
        _complete.Set();
    }

Проблема, с которой я столкнулся сейчас, заключается в том, что я хочу, чтобы newMethod вызывался каждый раз, когда я вхожу впока цикл.Но происходит следующее: цикл while завершается, и после этого новый метод вводится около тысячи раз.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Вам нужно вызвать метод с помощью proba:

System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(
     new Action(() => 
         {
               //do stuff with proba
         }
     ));

// edit:

подождите, это немного сложнее.Диспетчер - это объект, который может просто выполнить методы из других потоков.Это означает, что вам нужно создать диспетчер в потоке с proba и использовать этот диспетчер в другом потоке для выполнения метода, описанного выше.

0 голосов
/ 27 сентября 2011

Я бы посмотрел на использование BackgroundWorker - это избавляет от множества подобных операций.

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

В противном случае вам нужно использовать Control.Invoke для повторной синхронизации потоков - http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invoke.aspx (вы не должны и часто не можете получить доступ к пользовательскому интерфейсу из чего-либо, кроме потока пользовательского интерфейса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...