Я не профессионал многопоточности, но возможно, можно сделать так.
Создать объект для блокировки:
private static object dictionaryLock = new object();
Обернуть все обращения к dictionary конструкцией lock (dictionaryLock) {...}.
Таким образом вы сделаете работу с dictionary потокобезопасной. Остальная часть кода (длительно выполняющаяся) будет запускаться однократно для каждого ID только после потокобезопасной проверки словаря.