Здесь важен метод Thread.SetApartmentState ().Буфер обмена - это COM-объект, он не является поточно-ориентированным.Есть много функций Windows, которые ведут себя так, например, Drag + Drop, и диалоговые окна оболочки, такие как OpenFileDialog.
Вы не можете установить состояние квартиры потока пула потоков, это всегда MTA (многопоточная квартира),Вы можете в обычном потоке, но дополнительным требованием STA является то, что вы также качаете цикл сообщений (Application.Run).Это возвращает вам точно такую же проблему: вы не можете заблокировать или занять много времени для выполнения кода.
Простое решение состоит в том, чтобы делать все, что занимает много времени для выполнения в потоке.И сделать вызов буфера обмена из потока пользовательского интерфейса.Используйте Control.BeginInvoke () или, что лучше, BackgroundWorker.RunWorkerCompleted.