2009-04-01 3 views
1

Это легко Q, но большая помощь:.Net: Получение данных из потоков

Под название»Извлечение данных из потоков MSDN (Here) вводит способ получить данные из дочернего потока с помощью обратного вызова метод, который инкапсулируется делегат передаются от основного потока к дочернему потоку -., кто имеет данные

Вы можете видеть, что ясно (последний пример в MSDN page)

Моего Q является, так как мы взяв на себя получение данных (от дочерних потоков до май n thread) метод обратного вызова должен выполняться главным потоком, а не дочерним потоком ...

Я немного изменил код (чтобы убедиться в этом), поэтому я прикрепил имя потока до каждого выхода:

public static void ResultCallback(int lineCount) { 
    Console.WriteLine(Thread.CurrentThread.Name + ":Independent task printed {0} lines.", lineCount); 
} 

И я назвал ребенок тему: «method2» в то время как основной поток «Система» ...

Я получил этот результат: method2: Независимое задание печатается 1 линия.

где правильный вывод должен быть: системы: Независимая задача распечатана 1 линия ..

Кто пьян здесь? MSDN, мне или .NET?

ответ

0

"Вы" ;-p

Обратные вызовы по-прежнему выполняются на рабочем потоке; они возвращают данные вызывающему код - но они не имеют встроенного способа прерывания потока . Обязанность вашего кода в случае необходимости подталкивать эту работу к основному потоку. Например, через WinForms приложение, которое вы могли бы иметь:

public static void ResultCallback(int lineCount) { 
    // runs on worker thread 
    Invoke((MethodInvoker)delegate { 
     // runs on UI thread 
     Console.WriteLine(Thread.CurrentThread.Name + 
     ":Independent task printed {0} lines.", lineCount); 
    }); 
} 
+0

Я получил первую часть Но не понял, как я заработал работу в основной теме! – Shankarooni

+0

Какая архитектура вы используете? WinForms? Веб? МОФ? консоль? оказание услуг? Он меняется ... с winforms, есть Control.Invoke (показано выше). С WPF/Silverlight Диспетчер - и т. Д. –

+0

Я использую консоль для обучения нитям (Хм, поэтому он подчеркивал ключевое слово Invoke) – Shankarooni

0

Если вы не хотите/должны использовать обратные вызовы и данные достаточно мала, вы всегда можете использовать общую память и C# блокировки ключевого слова.

Maciej.

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