如何从另一个线程中的静态方法更改表单属性?

时间:2014-10-02 23:43:56

标签: c# winforms

我有一段时间试图实现,我真的陷入其中。我将从头开始:我有一个项目有两种形式,主要登录

登录表单非常简单,只询问用户ID和密码。加载表单时,它连接到服务器,当用户键入表单并单击登录时,它会向服务器发送登录请求。这是两种形式加载的示例。 Program.cs调用的第一个表单是login:

public static main Child;
private void login_Load(object sender, EventArgs e)
{
    Child = new main(this);
}

主要形式以这种方式开始:

public static login Parent;
public main(login parent)
{
    Parent = parent;
    sck_connect(); // the connection stuff is in this form, the main form
    InitializeComponent();
}

我需要的是登录以拥有一个对象(子)来访问main,并且main需要一个对象(父)来访问登录。谷歌不会告诉我这样做的方法,所以我不得不用我的想象力。 如果有更好的方法可以实现这一点,我会很高兴听到它。

正如您所看到的,main做的第一件事是调用sck_connect(),此方法将启动与服务器的套接字连接并使其保持活动状态。从现在开始一切正常。

用户单击登录按钮后,登录查询将立即发送到服务器。我们将等待其迅速回复:

IAsyncResult art = connection.BeginReceive(buffer, 0, bufferSize, SocketFlags.None, new AsyncCallback(receivedata_w), connection);

如您所见,当收到一些数据时,会调用方法receivedata_w

private static void receivedata_w(IAsyncResult ar)
{
    // here some wonderful-working code receiving data
    // and storing login query result in -> String instruction

    if (instruction == "LoginResultTrue") // login succeded. We hide the login
                                          // and show the main form
        {
            Parent.Visible = false; // hide the login form
            // this.visible = true;
        }
    if (instruction == "LoginResultFalse") // login error. We hide the main
                                           // form and show the login form
        {
            Parent.Visible = true; // show the login form
            // this.visible = false;
        }
}

如果您问自己:为什么如果visible=true表格已经可见,您需要再次设置login? - 当用户已登录并以main形式登录时,可能会有更多登录尝试(例如由于连接丢失和重新连接)

总而言之,问题是:如何从静态方法更改表单属性(或该表单中任何控件的属性)可能在另一个线程中?

我已经尝试了一切,我尝试的一切都给我一个不同的错误。谷歌似乎并没有试图帮助我。谢谢你的帮助,非常感谢。

1 个答案:

答案 0 :(得分:0)

您无法在不调用调度程序的情况下从工作线程更新GUI。见这里:How to update the GUI from another thread in C#?