Текущий поток должен быть задан как поток однопоточного контейнера
Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны. Проверьте, что ваша функция Main помечена атрибутом STAThreadAttribute.
Что это значит и как исправить? И почему она выскакивает не всегда?
Судя по докам, это надо для работы с COM
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.13.43310
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Текущий поток должен быть задан как поток однопоточного контейнера sta
Доброе время суток, у меня вопрос:
Для вызова окна в windows приложении я использую следующий код:
if (TxtfolderBrowserDialog.ShowDialog() == DialogResult.OK)
textBoxInput.Text = TxtfolderBrowserDialog.SelectedPath; и все работает прекрасно
А в веб-приложении мне выдает следующую ошибку: Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны. Проверьте, что ваша функция Main помечена атрибутом STAThreadAttribute. Данное исключение создается, только если к процессу подключен отладчик.
Подскажите пожалуйста в чем проблема? или может существует иной вариант для вызова окна "обзор папок"?
Ответы
Повторюсь: стандарт HTML ограничивает браузер в доступе к файловой системе. Все, что доступно приложению, — это дать выбрать пользователю один файл, после чего загрузить его на сервер (но не изменять, переименовывать или удалять с диска). Подумайте сами: это ж какой был бы простор для вирусов: Вы зашли на какой-то сайт, а он удалил у Вас на компьютере все содержимое диска.
При помощи расширений браузера можно обойти это ограничение, например, в Silverlight 4 есть доступ к папке "Мои документы" (но не к остальной части файловой системы).
Так что варианты:
- использовать Silverlight (и ограничиться папкой "Мои документы");
- может быть, в Adobe AIR есть какие-то возможности доступа к локальной файловой системе;
- давать пользователю выбрать файлы, а не папки;
- сделать настольное приложение и сервис на стороне сервера (если приложение должно быть кроссплатформенным, можно использовать Mono — так приложение сможет работать на Windows, Linux и MacOS, но для остальных платформ придется разрабатывать отдельные настольные приложения).
- Помечено в качестве ответа Zvezdochka 31 января 2011 г. 5:40
Все ответы
Обзор папок в ASP.NET WebForms? При помощи элемента FolderBrowserDialog Windows Forms?
У веб-приложений (без использования дополнительных плагинов) нет доступа к файловой системе компьютера клиента, соответственно, дерево каталогов на клиентской стороне отобразить невозможно.
Если нужно отобразить дерево каталогов, построенное по файловой системе сервера, напишите об этом в данной теме — я пришлю пример.
Скорее всего Zvezdochka хочет отобразить дерево каталогов клиентской стороны. Если это так, то Zvezdochka, для каких целей вы хотите это сделать, может быть найдется другое решение?
Да вы правильно поняли, необходимо отобразить дерево каталогов клиетской стороны.
Это необходимо по следующей причине:
Данное веб-приложение работает на сервере, оно будет обрабатывать xml-файлы, находящиеся на компьютере у пользователя, находящиеся в определенной папке. Для этого и необходимо отобразить дерево каталогов, чтобы пользователь выбрал папку в данном меню. А вот как разобраться не могу, если знаете решение подскажите пожалуйста.
Повторюсь: стандарт HTML ограничивает браузер в доступе к файловой системе. Все, что доступно приложению, — это дать выбрать пользователю один файл, после чего загрузить его на сервер (но не изменять, переименовывать или удалять с диска). Подумайте сами: это ж какой был бы простор для вирусов: Вы зашли на какой-то сайт, а он удалил у Вас на компьютере все содержимое диска.
При помощи расширений браузера можно обойти это ограничение, например, в Silverlight 4 есть доступ к папке "Мои документы" (но не к остальной части файловой системы).
Так что варианты:
- использовать Silverlight (и ограничиться папкой "Мои документы");
- может быть, в Adobe AIR есть какие-то возможности доступа к локальной файловой системе;
- давать пользователю выбрать файлы, а не папки;
- сделать настольное приложение и сервис на стороне сервера (если приложение должно быть кроссплатформенным, можно использовать Mono — так приложение сможет работать на Windows, Linux и MacOS, но для остальных платформ придется разрабатывать отдельные настольные приложения).
- Помечено в качестве ответа Zvezdochka 31 января 2011 г. 5:40
У меня вопрос по поводу 3 варианта — Предоставить возможность выбирать файлы.
Элемент <input type="file" name="FileName" runat="server" /> позволяет выбирать только 1 файл.
Где бы не искала не могу найти выбор нескольких файлов в окне. Требуется выбирать только один файл. Это не вариант, если учесть что файлов может быть очень много.
Находила готовые web-приложения с загрузкой нескольких файлов, а все таки требуется выбирать также по одному. Плюс в том, что потом можно загрузить их кучей на сервер.
Подскажите, как решить данную проблему?
До недавнего времени проблема решалась только использованием в веб-приложении Flash или Silverlight.
Теперь можно воспользоваться элементом из альфа-версии стандарта HTML 5:
Подробнее — в черновике спецификации . Вот здесь можно посмотреть пример. Только учтите, что этот способ поддерживается не во всех браузерах (в IE 8, например, не работает). Если нужна поддержка во всех современных браузерах, то тогда только Silverlight или Flash.
Да вы правильно поняли, необходимо отобразить дерево каталогов клиетской стороны.
Это необходимо по следующей причине:
Данное веб-приложение работает на сервере, оно будет обрабатывать xml-файлы, находящиеся на компьютере у пользователя, находящиеся в определенной папке. Для этого и необходимо отобразить дерево каталогов, чтобы пользователь выбрал папку в данном меню. А вот как разобраться не могу, если знаете решение подскажите пожалуйста.
А каким образом сервер будет обрабатывать файлы, которых у него нет. Допустим Вы найдете решение данного вопроса, как Вы вообще планируете это реализовать. Поверьте, если Вы сможете для себя ответить на последний вопрос, тогда я только могу Вам пожелать удачи, хотя я лично НЕ ПРЕДСТАВЛЯЮ КАК ЭТО РЕАЛИЗОВАТЬ.
Ошибка «Текущий поток должен быть установлен в однопоточное подразделение (STA)» при копировании строки в буфер обмена
Текущий поток должен быть установлен в режим однопоточного подразделения (STA), прежде чем можно будет выполнять вызовы OLE. Убедитесь, что на вашей функции Main отмечено STAThreadAttribute .
Как я могу это исправить?
4 ответа
Убедитесь, что поток, выполняющий код, отмечен атрибутом [STAThread]. Для WinForm и консольных приложений это обычно метод Main
Поместите [STAThread] над основным методом:
Для WinForms он обычно находится в сгенерированном файле Main.cs, который вы можете редактировать при необходимости (он не будет повторно сгенерирован при изменениях). Для консоли вы определяете Main .
Если вы не можете управлять потоком (например, вы пишете библиотеку или основное приложение по какой-то причине заблокировано), вы можете вместо этого запустить код, который обращается к буферу обмена в специально настроенном потоке ( .SetApartmentState(ApartmentState.STA) ), как показано в другом ответ.
Вы можете получить доступ к буферу обмена только из STAThread.
Самый быстрый способ решить эту проблему — поместить [STAThread] поверх вашего метода Main() , но если по какой-либо причине вы не можете этого сделать, вы можете использовать отдельный класс, который создает набор STAThread / получает строковое значение для вас.
Вопрос 8 лет, но многим еще нужно решение.
Как упоминалось другими, этот буфер обмена должен вызываться из основного потока или [STAThread].
Что ж, я использую этот обходной путь каждый раз. Может быть, это альтернатива.
Значение буфера обмена создается в потоке t.
Ключ: квартира потока t установлена в состояние STA.
Позже вы можете использовать значение буфера обмена в других потоках по своему усмотрению.
Текущий поток должен быть задан как поток однопоточного контейнера sta
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
private FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();
private OpenFileDialog openFileDialog1 = new OpenFileDialog();
private void InitializeComponent()
<
openFileDialog1.DefaultExt = "jpg";
openFileDialog1.Filter = "jpg files (*.jpg)|*.jpg";
folderBrowserDialog1.Description =
"Select the directory that you want to use as the default.";
folderBrowserDialog1.ShowNewFolderButton = false;
folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Desktop;
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
<
открывается окно Select the directory that you want to use as the default. — видно кнопки ок и кансел есть.
а самих папок не видно
Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008
Репутация: 1
Всего: 2
| Код |
| folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Desktop; |
Прямо указывает, что просмотр начинается с рабочего стола. Не на всяком столе есть папки 😉 Думаю, смена рутовой папки на что-то более адекватное поможет увидеть все, что нужно.
И чем не нравится запись
| Код |
| if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) < . > |
Зачем огороды городить с переменными, которые используются только в одном месте?
Это сообщение отредактировал(а) explorer — 26.11.2009, 14:34
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008
Репутация: 1
Всего: 2
Ага, ну теперь понятно, что ты делаешь Смотри, у тебя там смешаны два вида диалогов, для папок и для файлов. Судя по всему, кончечная твоя цель все же некая картинка, т.е. файл. Ну так зачем же тебе тогда диалог открытия папки?? Используй сразу диалог для файлов (он тоже отображает папки).
| Код |
| OpenFileDialog openFileDialog1 = new OpenFileDialog(); |
openFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "jpg files (*.jpg)|*.jpg" ;
openFileDialog1.RestoreDirectory = true ;
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
Профиль
Группа: Участник
Сообщений: 104
Регистрация: 26.2.2008
Репутация: 1
Всего: 2
Самый простой вариант, у меня такой работает:
| Код |
| private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog; |
| Код |
| folderBrowserDialog.Description = "My description"; if (folderBrowserDialog.ShowDialog() == DialogResult.OK) < MessageBox.Show(folderBrowserDialog.SelectedPath); > |
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск
Репутация: 5
Всего: 24
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
| Код |
| private static System.Windows.Forms.FolderBrowserDialog folderBrowserDialog; |
static void Main()
<
folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();
folderBrowserDialog.RootFolder = System.Environment.SpecialFolder.MyComputer;
folderBrowserDialog.ShowNewFolderButton = false;
Console.WriteLine("Starting screensaver");
string[] cmdList = Environment.CommandLine.Split(' ');
// First command-line param is the exe name, second param is the mode
if (cmdList.Length >= 2)
<
cmdList[1] = "/c";
if (cmdList[1].IndexOf("/c") >= 0) // Configuration mode
<
folderBrowserDialog.Description = "My description";
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
<
MessageBox.Show(folderBrowserDialog.SelectedPath);
>
//Application.Run(new OptionsForm());
return;
>
if (cmdList[1] == "/p") // Preview mode
<
previewMode = true;
// Handle to preview dialog box is next command-line param
parentHwnd = (IntPtr) uint.Parse(cmdList[2]);
>
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
folderBrowserDialog.RootFolder = System.Environment.SpecialFolder ; =может это при каких то ситуациях не работает.
что он должен запсывать в RootFolder ? я в дебаге проверю.
Добавлено через 2 минуты и 6 секунд
при дебаге мне выдается сообщение
Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны. Проверьте, что ваша функция Main помечена атрибутом STAThreadAttribute. Данное исключение создается, только если к процессу подключен отладчик.
это на if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009
Репутация: нет
Всего: 1
ха-ха, как не смешно. но блин. проведя самогипноз , я нашел эту дурацкую ошибку .
- Что же такое .NET? Краткое описание,изучаем.
- Какой язык программирования выбрать? выбираем.
- C#. С чего начать? начинаем.
- Защита исходного кода .NET приложений, защищаем.
- Литература по .NET, обращаемся.
- FAQ раздела,ищем здесь.
- Архиполезные ссылки:www.connectionstrings.com, www.pinvoke.net, www.codeproject.com
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
[ Время генерации скрипта: 0.1275 ] [ Использовано запросов: 21 ] [ GZIP включён ]