. Вы можете найти много похожих вопросов на SO, но никто (как я вижу) не рассматривает ситуацию, когда ваша логика должна что-то вернуть.InvalidOperationException: вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого
В этом примере кода у меня есть простой CustomMessageBox (это окно), которое должно вернуть что-то, введенное пользователем.
public class CustomMessageBox
{
private string Value
{
get
{
return txt_box.Text;
}
}
private CustomMessageBox()
{
InitializeComponent();
}
public static string Show(string caption = "Enter data")
{
CustomMessageBox cmb = new CustomMessageBox();
cmb.txt_block.Text = caption;
cmb.ShowDialog();
return cmb.Value;
}
}
Так что, когда Show
метод вызывается BackgroundWorker
, исключение брошено в первой строке, когда конструктор пытается выполнить. Исключение сообщение
An exception of type 'System.InvalidOperationException' occurred in
PresentationCore.dll but was not handled in user code
Additional information: The calling thread must be STA,
because many UI components require this.
Ничего нового, но я не могу найти решение этой проблемы, и я не могу сделать нить быть STA. Show
Подпись метода должна быть такой же: возьмите строку и строку возврата.
Как обычно такие вещи должны быть разрешены?
вы можете использовать диспетчер.Инвестию, чтобы поток был STA – daniel
Любой пример с возможностью возврата значения из исполнения, пожалуйста. –
Я обычно делал это наоборот (по крайней мере, в WinForms): вместо того, чтобы что-то возвращать, я подписался на Close-event и получил значение, которое мне нужно в обработчике событий. –