Фоновый рабочий инициирует компонент COM - PullRequest
0 голосов
/ 25 октября 2011

Я использую COM-компонент, который абсурдно медленен (занимает несколько минут, чтобы дать мне запрошенные данные), поэтому, чтобы сохранить отзывчивость пользовательского интерфейса, в моем приложении WPF я думаю использовать классы Task или BackgroundWorker для создания фонового потока и отключите все элементы управления в пользовательском интерфейсе, чтобы предотвратить любые проблемы, так как компонент не поддерживает потоки.

Компонент добавляется в проект просто как стандартная ссылка COM. Проблема в том, что он просто не работает (включая инициализацию с использованием new) из любого фонового потока. Он отлично работает из потока пользовательского интерфейса. Любые указатели будут оценены.

1 Ответ

3 голосов
/ 25 октября 2011

Вы пытались добавить атрибут [STAThread] к Main()?

[STAThread]
static void Main()
{
}

Когда применяется STAThreadAttribute , он изменяет состояние квартиры текущего потока на однопоточное.
Не вдаваясь в подробное обсуждение COM и потоков, этоАтрибут обеспечивает механизм связи между текущим потоком и другими потоками, которые могут захотеть общаться с ним через COM.
Этот атрибут обычно автоматически применяется к Main при запуске нового проекта пользовательского интерфейса.


Или (как сказал мне SLaks) вы можете попробовать:

Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);
....

public void ThreadProc()
{
    // Thread function
}

Вы также можете использовать

bool result = t.TrySetApartmentState(ApartmentState.STA);

и проверить значение result, чтобы убедиться, что ваша попытка была успешной

...