Правильно ли/необходимо использовать UnsafeStart для запуска второго потока STA, чтобы избежать контекста пользовательскC#

Место общения программистов C#
Ответить
Anonymous
 Правильно ли/необходимо использовать UnsafeStart для запуска второго потока STA, чтобы избежать контекста пользовательск

Сообщение Anonymous »

Контекст:
В моем приложении есть функция «Вставить», которая запускает операцию копирования или перемещения скопированных/вырезанных файлов. Код, выполняющий конечный ввод-вывод, представляет собой метод статического вспомогательного класса и называется 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();
Но мне интересно: данный код использует Thread.Start. В примечаниях к Thread.UnsafeStart говорится:

В отличие от Start(), который захватывает текущий ExecutionContext и использует его контекста для вызова делегата потока, UnsafeStart() явно избегает захвата текущего контекста и передачи его вызову.

В моем текущем случае , я всегда вызываю свой метод ClipboardOperations.Paste из асинхронного метода, который был запущен с помощью Task.Run, поэтому использование одного и того же ExecutionContext не будет контекстом потока пользовательского интерфейса. Но что, если ClipboardOperations.Paste был вызван напрямую из потока пользовательского интерфейса? Должен ли я использовать Thread.UnsafeStart, чтобы убедиться, что код никогда не блокирует поток пользовательского интерфейса?
(Примечание: я создаю поток внутри ClipboardOperations.Paste, поэтому я знаю, что коду нужен поток STA, но он не имеет доступа к элементам пользовательского интерфейса.)

Подробнее здесь: https://stackoverflow.com/questions/789 ... ad-to-avoi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»