С# Управление формой с использованием другого потока, а также предотвращение дублирования форм

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

просто большинство слов, используемых в кодировке, для меня новые. мне очень нужно ваше руководство, ребята.. =(

по моей проблеме..

у меня есть 2 формы в моем проекте. форма 1 действует как мой экран входа в систему, а форма 2 открывается, если логин пользователя правильный.

я использую UDP в качестве сокета для подключения. я сделал простой UDPlistener внутри таймера (причина в том, что если я не закрою его, если нечего читать, это просто заставит мою программу зависнуть и продолжать ждать сообщений)

Примечание: мой прослушиватель UDP запускается в другом потоке, подобном этому.

Thread thread1 = new Thread(UDPListener.StartListener);
thread1.SetApartmentState(ApartmentState.STA);
Thread.Sleep(100);
thread1.TrySetApartmentState(ApartmentState.STA);

thread1.Start();

когда серверная программа посылает мне сигнал открыть форму2, проблема возникает.

проблема в том, что форма2 появилась... но форма1 не скрывалась или не была видна=ложь; (form1 должен уметь это делать)

Я делаю этот код, когда пытаюсь показать форму2 и скрыть форму1. Примечание: есть еще одна проблема (не совсем уверен). Я заметил, что это просто дублирование форм.

Form1 f1 = new Form1();
Form2 f2 = new Form2();
f1.Command("009");
f1.MiniTicker.Enabled = false; //need to do this, cant do this without putting Form1 f1 = new Form1();
Login.TBOption.showTaskBar();
TaskbarHide.Taskbar.Hide();
f1.CoreAds.Enabled = false; //same here

f1.Visible = false;
f1.Hide();

f1.Invoke(
(MethodInvoker)(() =>
{
new TimerMode().Show();
}));


f1.Invoke(
(MethodInvoker)(() =>
{
new MainForm().Hide();
}));

Последнее примечание: после того, как я запустил приведенный выше код... Form1 похож на закрытие, но после этого он снова открывается...

пожалуйста, помогите мне решить мою проблему. мне нужно закончить дипломную работу =(


person Katherina    schedule 12.05.2011    source источник
comment
я все еще сталкиваюсь с этой проблемой.. =(   -  person Katherina    schedule 12.05.2011
comment
С точки зрения практики кодирования нецелесообразно называть ваши формы Form1 и Form2, а скорее давать им описательное имя. Почему бы не LoginForm и MainForm (или что-то еще более описательное)   -  person Martijn    schedule 12.05.2011


Ответы (1)


Я собираюсь предположить, что вторая партия кода выполняется в потоке, который вы создали в первой партии. Если это так, то большинство ваших проблем возникает из-за того, что вы получаете доступ к элементам пользовательского интерфейса из рабочего потока. Позвольте мне сделать это совершенно ясно. Единственное, что вы можете сделать с Form или Control из рабочего потока, это вызвать Invoke или BeginInvoke. Вот и все. Вы абсолютно не можете делать ничего другого.

  • Вы не можете вызвать конструктор Form.
  • Вы не можете установить свойство Form.Visible.
  • Вы не можете позвонить Form.Hide.
  • Вы не можете получить доступ к к чему-либо, относящемуся к файлу Form или содержащемуся в нем.

Это стоит повторить. За исключением методов ISynchronizeInvoke, больше ничего нельзя использовать для ссылки Form из рабочего потока. Если вы попытаетесь получить доступ к любому элементу пользовательского интерфейса из потока, отличного от основного потока пользовательского интерфейса, ваше приложение завершится ошибкой; иногда непредсказуемо, а иногда эффектно.

person Brian Gideon    schedule 12.05.2011
comment
Здравствуй. Брайан, я очень благодарен за ваше объяснение. даже если это немного грустно, он не может этого сделать .. сейчас я думаю. как еще я могу решить эту проблему.. как вы думаете, мне нужно изменить мой Listener (udp)? Я помню, что это причина, по которой возникла эта проблема. почему я поместил этот код в другую ветку. Брайан действительно спасибо, я узнал что-то новое - person Katherina; 14.05.2011