C#使用另一个线程控制表单,也防止复制表单

时间:2011-05-12 01:20:22

标签: c# winforms multithreading invoke

首先,我很抱歉,即使有很多可能与我的问题有关的主题,我仍然无法弄清楚如何解决我的问题..

只是编码中使用的大多数单词对我来说都是新的。 我真的需要你的指导.. =(

关于我的问题..

我的项目中有2个表格。 form1充当我的登录屏幕 如果用户登录正确,将打开form2

我使用UDP作为我的连接套接字。我做了一个简单的UDPlistener 在一个计时器内(原因是因为如果我没有关闭它,如果没有什么可读,它只会 让我的程序挂起,并继续等待消息

注意:我的UDP侦听器正在不同的线程上运行,如

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

thread1.Start();

当服务器程序向我发送信号以打开form2时 问题现在发生..

问题是.. form2出现..但是form1没有隐藏或者可见= false; ( form1需要能够做到

当我试图显示form2并隐藏form1时,我正在执行此代码 注意:另一个问题是(不太确定)..我注意到它只是重复表格

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就像关闭一样,但之后再次打开...

请帮我解决我的问题。我需要完成我的论文项目=(

1 个答案:

答案 0 :(得分:0)

我将假设第二批代码正在您在第一批创建的线程上执行。如果是这种情况,则会出现大多数问题,因为您正在从工作线程访问UI元素。让我说清楚这一点。您可以使用来自工作线程的FormControl来做唯一的事情是致电InvokeBeginInvoke。这就对了。你绝对不能做任何事情。

  • 您无法调用Form构造函数。
  • 您无法设置Form.Visible属性。
  • 您无法拨打Form.Hide
  • 您无法访问与Form相关或包含的任何

这值得重复。除了ISynchronizeInvoke方法之外,您无法在工作线程的Form引用上使用其他任何内容。如果您尝试从主UI线程以外的线程访问任何UI元素,那么您的应用程序将失败;有时不可预测,有时甚至是惊人的。