Пользовательский интерфейс обычно имеет противоположное ограничение (к сожалению): он однопоточный, и все должно происходить в этом потоке.
Самый простой способ проверить, всегда ли вы находитесь в одном потоке (например, для функции), - это установить целочисленную переменную в -1 и иметь функцию проверки, например (например, вы в C #):
void AssertSingleThread()
{
if (m_ThreadId < 0) m_ThreadId = Thread.CurrentThread.ManagedThreadId;
Debug.Assert(m_ThreadId == Thread.CurrentThread.ManagedThreadId);
}
Это говорит:
Я не понимаю вопроса № 1, правда. Зачем хранить в расположении на основе потоков, если ваша цель - иметь глобальную область видимости?
Что касается второго вопроса, большая часть кода COM выполняется в одном потоке и, чаще всего, в потоке, в котором выполняется обработка сообщений вашего интерфейса пользователя, - это потому, что большая часть кода COM разработана для совместимости с VB6, который является однопоточным.
Причина, по которой ваша программа имеет около 10 потоков, заключается в том, что как Windows (если вы используете некоторые из ее функций, например, порты завершения или некоторые таймеры), так и CLR (например, для GC или, опять же, некоторые типы таймеров). ) может создавать потоки в вашем пространстве процессов (технически любая программа с достаточным количеством привилегий тоже может).