Когда я скопировал программу из учебника Winform и попытался запустить ее в Visual Studio, компилятор предупредил меня об этом исключении, ниже указана неверная функция, и он показывает мне следующее: System.Threading.ThreadStateException
HResult =0x80131520
Сообщение=Прежде чем вы сможете выполнять вызовы OLE, вы должны перевести текущий поток в режим однопоточного подразделения (STA). Убедитесь, что ваша основная функция отмечена атрибутом STAThreadAttribute. Это исключение возникает только в том случае, если к процессу подключен отладчик.
Source=System.Windows.Forms StackTrace: в System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner) в System.Windows.Forms.CommonDialog. ShowDialog (владелец IWin32Window) в MyNamespace.MyForm.OnLoadClick (отправитель объекта, EventArgs e) в E:\Visual Studio Projects\Winform\Program.cs: строка 37 в System.Windows.Forms.Button.OnClick(EventArgs e) в System .Windows.Forms.Button.OnMouseUp(событие MouseEventArgs) в System.Windows.Forms.Control.WmMouseUp(Message& m, кнопка MouseButtons, клики Int32) в System.Windows.Forms.Control.WndProc(Message& m) в System.Windows .Forms.ButtonBase.WndProc(Message& m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) в System.Windows.Forms.NativeWindow.Callback(HWND hWnd, MessageId msg, WPARAM wparam, LPARAM lparam) < /p>
Код:
private void OnLoadClick(object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Open Photo";
dlg.Filter = "png files (*.png)|*.png|All files (*.*)|*.*";
***if (dlg.ShowDialog() == DialogResult.OK)*** //that's the wrong place
{
pboxPhoto.Image = new Bitmap(dlg.OpenFile());
}
dlg.Dispose();
}
Все, что я хочу знать, это почему возникает эта ошибка.
Я следую инструкциям и добавляю [STKThread] перед функцией Main, и это решено. Но я до сих пор не понимаю, почему и эта программа скопирована из книги. Вот и весь код
namespace MyNamespace
{
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public class MyForm : System.Windows.Forms.Form
{
Button btnLoad;
PictureBox pboxPhoto;
public MyForm()
{
this.Text = "Hello Form 1.3";
// Create and configure the Button
btnLoad = new Button();
btnLoad.Text = "&Load";
btnLoad.Left = 10;
btnLoad.Top = 10;
btnLoad.Click += new System.EventHandler(OnLoadClick);
// Create and configure the PictureBox
pboxPhoto = new PictureBox();
pboxPhoto.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
pboxPhoto.Width = this.Width / 3;
pboxPhoto.Height = this.Height / 3;
pboxPhoto.Left = (this.Width - pboxPhoto.Width) / 2;
pboxPhoto.Top = (this.Height - pboxPhoto.Height) / 2;
pboxPhoto.SizeMode = PictureBoxSizeMode.StretchImage;
// Add our new controls to the Form
this.Controls.Add(btnLoad);
this.Controls.Add(pboxPhoto);
}
private void OnLoadClick(object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Open Photo";
dlg.Filter = "png files (*.png)|*.png|All files (*.*)|*.*";
if (dlg.ShowDialog() == DialogResult.OK)
{
pboxPhoto.Image = new Bitmap(dlg.OpenFile());
}
dlg.Dispose();
}
// [STAThread]
public static void Main()
{
Application.Run(new MyForm());
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... o-avoid-it
Что такое System.Threading.ThreadStateException и как его избежать ⇐ C#
Место общения программистов C#
-
Anonymous
1728447214
Anonymous
Когда я скопировал программу из учебника Winform и попытался запустить ее в Visual Studio, компилятор предупредил меня об этом исключении, ниже указана неверная функция, и он показывает мне следующее: System.Threading.ThreadStateException
HResult =0x80131520
Сообщение=Прежде чем вы сможете выполнять вызовы OLE, вы должны перевести текущий поток в режим однопоточного подразделения (STA). Убедитесь, что ваша основная функция отмечена атрибутом STAThreadAttribute. Это исключение возникает только в том случае, если к процессу подключен отладчик.
Source=System.Windows.Forms StackTrace: в System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner) в System.Windows.Forms.CommonDialog. ShowDialog (владелец IWin32Window) в MyNamespace.MyForm.OnLoadClick (отправитель объекта, EventArgs e) в E:\Visual Studio Projects\Winform\Program.cs: строка 37 в System.Windows.Forms.Button.OnClick(EventArgs e) в System .Windows.Forms.Button.OnMouseUp(событие MouseEventArgs) в System.Windows.Forms.Control.WmMouseUp(Message& m, кнопка MouseButtons, клики Int32) в System.Windows.Forms.Control.WndProc(Message& m) в System.Windows .Forms.ButtonBase.WndProc(Message& m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) в System.Windows.Forms.NativeWindow.Callback(HWND hWnd, MessageId msg, WPARAM wparam, LPARAM lparam) < /p>
Код:
private void OnLoadClick(object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Open Photo";
dlg.Filter = "png files (*.png)|*.png|All files (*.*)|*.*";
***if (dlg.ShowDialog() == DialogResult.OK)*** //that's the wrong place
{
pboxPhoto.Image = new Bitmap(dlg.OpenFile());
}
dlg.Dispose();
}
Все, что я хочу знать, это почему возникает эта ошибка.
Я следую инструкциям и добавляю [STKThread] перед функцией Main, и это решено. Но я до сих пор не понимаю, почему и эта программа скопирована из книги. Вот и весь код
namespace MyNamespace
{
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public class MyForm : System.Windows.Forms.Form
{
Button btnLoad;
PictureBox pboxPhoto;
public MyForm()
{
this.Text = "Hello Form 1.3";
// Create and configure the Button
btnLoad = new Button();
btnLoad.Text = "&Load";
btnLoad.Left = 10;
btnLoad.Top = 10;
btnLoad.Click += new System.EventHandler(OnLoadClick);
// Create and configure the PictureBox
pboxPhoto = new PictureBox();
pboxPhoto.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
pboxPhoto.Width = this.Width / 3;
pboxPhoto.Height = this.Height / 3;
pboxPhoto.Left = (this.Width - pboxPhoto.Width) / 2;
pboxPhoto.Top = (this.Height - pboxPhoto.Height) / 2;
pboxPhoto.SizeMode = PictureBoxSizeMode.StretchImage;
// Add our new controls to the Form
this.Controls.Add(btnLoad);
this.Controls.Add(pboxPhoto);
}
private void OnLoadClick(object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Open Photo";
dlg.Filter = "png files (*.png)|*.png|All files (*.*)|*.*";
if (dlg.ShowDialog() == DialogResult.OK)
{
pboxPhoto.Image = new Bitmap(dlg.OpenFile());
}
dlg.Dispose();
}
// [STAThread]
public static void Main()
{
Application.Run(new MyForm());
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79068497/whats-system-threading-threadstateexception-and-how-to-avoid-it[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия