В моем приложении есть функция «Вставить», которая запускает операцию копирования или перемещения скопированных/вырезанных файлов. Код, выполняющий конечный ввод-вывод, представляет собой метод статического вспомогательного класса и называется ClipboardOperations.Paste. В настоящее время он вызывается из ICommand/
Код: Выделить всё
DelegateCommandНекоторое время назад я добавил асинхронный уровень в свои долго выполняющиеся команды, включая команду вставки. Это нарушило операцию вставки, поскольку она использует некоторые методы буфера обмена, а они используют вызовы OLE, для которых требуется поток STA. А поскольку мой асинхронный уровень использовал Task.Run, код больше не запускался в потоке STA.
Чтобы быстро исправить это, я использовал Dispatcher потока пользовательского интерфейса. , чтобы вставить команду Paste обратно в поток пользовательского интерфейса, поскольку это хорошо известный пример потока STA.
Теперь меня спросили если бы я мог исправить, что контекстное меню остается открытым во время операции с файлом (см. также этот вопрос). Поэтому сейчас я подумываю о создании нового потока STA, который будет а не потоком пользовательского интерфейса, как предложено в этом ответе на ту же проблему.
Код: Выделить всё
var threadStart = new ThreadStart(action);
var thread = new Thread(threadStart);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
В отличие от Start(), который захватывает текущий ExecutionContext и использует его контекста для вызова делегата потока, UnsafeStart() явно избегает захвата текущего контекста и передачи его вызову.
В моем текущем случае , я всегда вызываю свой метод ClipboardOperations.Paste из асинхронного метода, который был запущен с помощью Task.Run, поэтому использование одного и того же ExecutionContext не будет контекстом потока пользовательского интерфейса. Но что, если ClipboardOperations.Paste был вызван напрямую из потока пользовательского интерфейса? Должен ли я использовать Thread.UnsafeStart, чтобы убедиться, что код никогда не блокирует поток пользовательского интерфейса?
(Примечание: я создаю поток внутри ClipboardOperations.Paste, поэтому я знаю, что коду нужен поток STA, но он не имеет доступа к элементам пользовательского интерфейса.)
Подробнее здесь: https://stackoverflow.com/questions/789 ... ad-to-avoi
Мобильная версия