Установка потока на STA в ASP.NET

Я пытаюсь поместить копию в буфер обмена в моем файле .ascx. Поскольку это ASP.NET, нет основной функции, в которую можно было бы поместить [STAThread].

Я получаю сообщение об ошибке: «Текущий поток должен быть установлен в режим однопоточного подразделения (STA), прежде чем могут выполняться вызовы OLE. Убедитесь, что ваша функция Main имеет атрибут STAThreadAttribute, отмеченный на нем».

В моем файле ascx.cs есть using System.Windows.Forms;, а затем одна строка кода Clipboard.SetText("Hello, clipboard");

Я попытался найти решение, но большинство решений предполагают, что есть main или, скажем, для удаления dll. Эти решения не подходят для моей ситуации.


person emmajean    schedule 10.02.2015    source источник
comment
Я не уверен на 100%, но все же достаточно уверен, что вы не можете изменить рабочий поток ASP.NET на STA. В любом случае, режим квартиры не может быть изменен после выполнения потока. Но вы всегда можете запустить новый STA Thread; и установите его режим квартиры на STA непосредственно перед .Start(); и выполните свой код, использующий OLE, в этом потоке.   -  person stakx - no longer contributing    schedule 11.02.2015
comment
Как мне тогда это сделать? перед использованием Clipboard.SetText вызвать STAThreadAttribute? Куда мне поставить .Start () в этом случае?   -  person emmajean    schedule 11.02.2015
comment
stakx - это то, как я подошел бы к этой проблеме STA с мыслью, что я буду создавать новый поток. Я не уверен, как вы управляете первым потоком CoCreate в процессе IIS, чтобы это могло вас в конце концов подвести. ОДНАКО Я не могу представить ЛЮБОЙ сценарий, в котором я бы копировал между потоками в многопоточном сервисном приложении, таком как IIS, с использованием буфера обмена. У вас будет несколько потоков, читающих и записывающих неправильные данные. Существует множество других способов межпроцессного взаимодействия IPC и обмена данными одного и того же процесса, например объекты кэша и уникальные указатели на базы данных сеанса.   -  person Sql Surfer    schedule 11.02.2015
comment
Я изменил свой код на следующий: var thread = new Thread(() => Clipboard.SetText("Hello, clipboard")); thread.SetApartmentState(ApartmentState.STA); thread.Start(); Я больше не получаю сообщение об ошибке, однако текст не копируется на доску для кликов.   -  person emmajean    schedule 11.02.2015
comment
Кажется, ваш подход находится внутри сервера. Посмотрите ответ в этом вопросе. Решает проблему в браузере. stackoverflow.com/questions/17527870 /   -  person Sql Surfer    schedule 11.02.2015


Ответы (1)


Вы придерживаетесь неправильного подхода. Вы думаете об этом с точки зрения сервера, но вы не можете получить доступ к буферу обмена пользователя со стороны сервера. Однако вы можете сделать это из JavaScript, запущенного на клиенте. Но это другой вопрос, и на него уже был дан ответ .

person mason    schedule 10.02.2015