Делегирование кода для запуска из основного потока для обработки графического интерфейса из основного потока - PullRequest
1 голос
/ 07 апреля 2010

У меня есть некоторый код, который выполняется фоновым специалистом. Мне бы хотелось, чтобы какой-то конкретный код показывал, что некоторый графический интерфейс запускается в контексте основного потока (2 причины 1. это должно блокировать 2. Я знаю, что обрабатывать графический интерфейс проблематично) контролирует от фонового рабочего) Я поднимаю событие, передаю класс и слушаю событие в mainForm, проверяю, требуется ли вызывать, и повторно вызываю. затем вызовите открытый метод экземпляра, который я хочу запустить в главном потоке. У меня есть несколько вопросов:

  1. есть ли проблема при обработке элемента данных, созданного в контексте backgoundworker из основного потока, - для чтения и изменения значения

  2. есть ли шаблон дизайна для такой проблемы? В идеале я хотел бы запустить любой делегат - любое возвращаемое значение и несколько общих параметров - как встроенный в делегат func - это проблематично, потому что это означает, что если я хочу поддерживать до 3 параметров с или без возвращаемых значений, мне придется есть 6 событий и 6 слушателей, которые фактически делают то же самое - у кого-нибудь есть идеи, как сделать это правильно? Спасибо!

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

Я только что написал это для аналогичного вопроса.

Я использую нити для такого рода вещей.

где-то в моем коде:

// Definition 
private static Thread TH; 

....

// When process starts
TH = new Thread(new ThreadStart(Splash_MyCallBack)); 
TH.Start();

....

// This method starts the form that shows progress and other data
static private void Splash_MyCallBack()
{
   frmLoading FL;

   FL = new frmLoading();

   FL.ShowDialog();

} /* Splash_MyCallBack*/

// Your process calls Splash_Stop when it is done.
static public void Splash_Stop()
{
   TH.Abort();
} /* Splash_Stop*/

frmLoading выполняет визуальные функции, в то время как в фоновом режиме у меня очень трудоемкая задача.Мой процесс сообщает интерфейсу о своем прогрессе.frmLoading реализует этот интерфейс, так что он знает о нем и может показывать, когда он необходим (в моем случае 2 индикатора выполнения). Единственное, что нужно, это значит, что frmLoading должен иметь это в конструкторе:рискованно в некоторых сценариях (не в моем случае).

Я думаю, что тот факт, что основной процесс вызывает интерфейс для обновления прогресса, а реальный интерфейс потребляет это шаблон.Надеюсь, это поможет, я могу добавить больше материала, если хотите.

С уважением,

1 голос
/ 07 апреля 2010

Чтобы ответить на ваш первый вопрос:

Не должно быть проблем с обработкой данных, созданных в фоновом режиме. Я сделал это в нескольких приложениях и не было никаких проблем.

...