Я использую COM-объект из сторонней библиотеки, которая генерирует периодические события. Когда я использую библиотеку из приложения Winforms, имея объект как член класса и создавая его в потоке основной формы, все работает. Однако, если я создаю объект из другого потока, я не получаю никакого события.
Я предполагаю, что мне нужен какой-то цикл событий в том же потоке, который использовался для создания объекта.
Мне нужно использовать этот объект из консольного приложения. Я предполагаю, что я мог бы использовать Application.DoEvents, но я бы предпочел не включать пространство имен Winforms в консольное приложение.
Как я могу решить эту проблему?
Обновление 3 (2011-06-15): Поставщик наконец ответил. Короче говоря, они говорят, что существует некоторая разница между насосом сообщений, созданным Application.Run и тем, который был создан Thread.Join, но они не знают, что это за разница.
Я согласен с ними; любой свет, пролитый на этот вопрос, будет очень оценен.
Обновление:
От комментария Ричарда до ответа mdm:
если другой компонент является однопоточным и создается из MTA, тогда Windows создаст рабочий поток + окно + насос сообщений и выполнит необходимую сортировку.
Пытаясь следовать его совету, я делаю следующее:
Обновление 2:
Я изменил код после ответа Жоао Анджело.
using System;
namespace ConsoleApplication2
{
class Program
{
[STAThread]
static void Main(string[] args)
{
MyComObjectWrapper wrapper = new MyComObjectWrapper();
}
}
class MyComObjectWrapper
{
MyComObject m_Object;
AutoResetEvent m_Event;
public MyComObjectWrapper()
{
m_Event = new System.Threading.AutoResetEvent(false);
System.Threading.Thread t = new System.Threading.Thread(() => CreateObject());
t.SetApartmentState (System.Threading.ApartmentState.STA);
t.Start();
Wait();
}
void ObjectEvt(/*...*/)
{
// ...
}
void Wait()
{
m_Event.WaitOne();
}
void CreateObject()
{
m_Object = new MyComObject();
m_Object.OnEvent += ObjectEvt;
System.Threading.Thread.CurrentThread.Join();
}
}
}
Я также попробовал следующее:
public MyComObjectWrapper()
{
CreateObject();
}