Есть,
приложение А (пА) — простое WinForms app.
приложение Б (пБ) — class library в котором есть некий класс который возбжудает некоторые события.
пА — подключенно к событиям пБ и модифицирует свои визуальные обьекты.
Всё работало хорошо пока пБ не стало многопоточным и теперь события выбрасываются из потока отличного от главного потока пА.
Ясно что теперь в пА в каждом обработчике события где изменяются визуальные контролы надо использовать BeginInvoke, и это прекрасно работает, но
пА настлько большое что займёт много времени что-бы найти все такие места и добавить нужный код.
Поэтому возник вопрос, как возбуждать события в пБ которые бы были в том же потоке что и главный поток пА.
пБ
public event OnTimestamp NewTimestamp;
public delegate void OnTimestamp(DateTime Stamp);
...
m_ddfClient.NewTimestamp += new Client.NewTimestampEventHandler(m_ddfClient_NewTimestamp); //это многопоточное событие, 3rd party object
...
void m_ddfClient_NewTimestamp(object sender, Client.NewTimestampEventArgs e)
{
if (NewTimestamp != null)
NewTimestamp(e.Timestamp); //это наше событие, должно вызыватся в том же потоке что и главный поток пА
}
Как присоеденить пА и пБ что-бы наши события из пБ бы-ли как single-threaded?
Здравствуйте, Holms, Вы писали:
H>Есть, H>приложение А (пА) — простое WinForms app. H>приложение Б (пБ) — class library в котором есть некий класс который возбжудает некоторые события. H>пА — подключенно к событиям пБ и модифицирует свои визуальные обьекты. H>Всё работало хорошо пока пБ не стало многопоточным и теперь события выбрасываются из потока отличного от главного потока пА. H>Ясно что теперь в пА в каждом обработчике события где изменяются визуальные контролы надо использовать BeginInvoke, и это прекрасно работает, но H>пА настлько большое что займёт много времени что-бы найти все такие места и добавить нужный код. H>Поэтому возник вопрос, как возбуждать события в пБ которые бы были в том же потоке что и главный поток пА.
H>пБ
H>
H>public event OnTimestamp NewTimestamp;
H>public delegate void OnTimestamp(DateTime Stamp);
H>...
H>m_ddfClient.NewTimestamp += new Client.NewTimestampEventHandler(m_ddfClient_NewTimestamp); //это многопоточное событие, 3rd party object
H>...
H>void m_ddfClient_NewTimestamp(object sender, Client.NewTimestampEventArgs e)
H>{
H> if (NewTimestamp != null)
H> NewTimestamp(e.Timestamp); //это наше событие, должно вызыватся в том же потоке что и главный поток пА
H>}
H>
H>Как присоеденить пА и пБ что-бы наши события из пБ бы-ли как single-threaded?
в пБ можно передать ссылку на главную форму пА? наверное, тогда можно было бы в пБ проверять в UI-ном ли мы потоке и дергать события только в нем.
if (form.InvokeRequired)
{
form.Invoke (NewTimestamp, e.Timestamp);
}
else
{
NewTimestamp(e.Timestamp);
}
KSK>в пБ можно передать ссылку на главную форму пА? наверное, тогда можно было бы в пБ проверять в UI-ном ли мы потоке и дергать события только в нем. KSK>if (form.InvokeRequired) KSK>{ KSK> form.Invoke (NewTimestamp, e.Timestamp); KSK>} KSK>else KSK>{ KSK> NewTimestamp(e.Timestamp); KSK>}
Здравствуйте, Holms, Вы писали:
H>пА настлько большое что займёт много времени что-бы найти все такие места и добавить нужный код.
Я бы все же потратил это время. Заодно и обернул бы все такие места единым механизмом, чтобы конкретика синхронизации была ровно в одно месте.
H>Поэтому возник вопрос, как возбуждать события в пБ которые бы были в том же потоке что и главный поток пА.
В методе инициализации/запуска процесса, который инициирует пА и который выполняется в GUI потоке, создаешь экземпляр AsyncOperation, в дальнейшем события вызываешь через него.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
Здравствуйте, AndrewVK, Вы писали:
AVK>В методе инициализации/запуска процесса, который инициирует пА и который выполняется в GUI потоке, создаешь экземпляр AsyncOperation, в дальнейшем события вызываешь через него.
а можно про это поподробнее
пА это простое приложение WinForms
обьект из пБ, который возбуждает события, создатся так