Надеюсь все предельно ясно объяснено
Не надейся. Тебе не понятно, а другим - тем более. Попробуй объяснить задачу, а не выдавать обрывки мыслей.
мне нужно сделать 1 окно в котором будут обрабатываться данные из нескольких потоков поочередно, в порядке добавления. т.е. при вызове одного и того-же экземпляра этого окна, из разных мест, в одно и то-же время - вызовы обрабатывались в порядке возникновения, и по очереди после завершения предыдущего - в 1 окне.
Например: из метода 1 потока поступил вызов диалогового окна(ДО) в котором пользователь вводит в 2 поля значения X и Y , нажимает на кнопку - после того как произвелись действия должен вернуть результат в переменную, и продолжить выполение метода из которого была вызвана. НО пока пользователь вводит данные, ДО было вызвано из другого потока (этот же экземпляр). Нужно что-бы данные переданные из 2 потока в это окно начали обрабатываться после завершения обработки данных первого...
т.е. пользователь жмет кнопку - результат возвращается в первый поток, в этом-же окне обрабатываются данные 2 потока и результат возвращается во 2 поток. Если более вызовов окна не поступало - оно закрывается.
Добавлено через 5 минут и 8 секунд:Для работы окна нужен отдельный поток. Этот поток может спать и ждать события (AutoResetEvent), которое устанавливает каждый рабочий поток после помещения данных в очередь. После установки события поток окна просыпается и открывает модальное окно, которое не закрывается, пока очередь не опустошится. После закрытия окна поток в цикле возвращается в спящее состояние к ожиданию события.
Очередь (Queue), естественно, должна быть синхронизирована на операции постановки в очередь, извлечения из очереди и проверки на пустоту. Для этого можно создать собственный класс-обёртку и внутри методов использовать конструкцию lock(this). Установку вышеупомянутого события для потока окна можно поручить обёртке в методе постановки очередного запроса в очередь.
Чтобы рабочие потоки ждали окончания обработки, запросы, которые поступают в очередь, нужно упаковать в структуру вместе с событиями (либо ManualResetEvent, либо AutoResetEvent). Флаг события должен быть изначально сброшен. Когда рабочий поток обращается к классу-обёртке очереди с просьбой поместить данные на обработку, обёртка создаёт эту структуру, в которую помещает данные и новое созданное событие, затем всю структуру ставит в очередь. Далее возвращает вызывающему потоку объект события. Вызывающий поток, получив событие, тут же становится на его ожидание. Поток окна, извлекая из очереди структуры, обрабатывает данные, а в конце обработки очередного запроса устанавливает событие из текущей структуры. Это разбудит именно тот ожидающий рабочий поток, который послал именно этот запрос, и позволит ему продолжить работу.
Спасибо за совет) но можно пример? я еще только пол года изучаю C# и не очень хорошо все это понимаю...