2010-04-07 3 views
1

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

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

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

ответ

1

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

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

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

// 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 реализует этот интерфейс, так что знает об этом и может показать whaever это необходимо (2 прогресс бары в моем случае) Tha только улова, frmLoading должны иметь это в конструкторе:

Control.CheckForIllegalCrossThreadCalls= false; 

, которые могут быть рискованными в некоторых сценариях (не в моем случае).

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

С уважением,

1

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

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

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