【发布时间】:2020-08-21 16:57:01
【问题描述】:
我正在开发一个客户端/服务器应用程序。 在客户端应用程序中,我有一个作为 MDI 父级的主窗体。 主窗体有一个 Load 事件,它创建一个子窗体的新实例并使其可见。 该事件还将 Main 确立为 Child 的 MdiParent。 Child 表单是一个登录屏幕。 从子窗体中,我创建了对父窗体的引用,以便能够从父窗体调用方法。
但是,在执行 MdiParent.RequestConnection 方法时,GUI 会卡住。 所以我尝试从线程执行该方法,但它不接受我的声明,即使我似乎遵循正确的语法。 我不明白我做错了什么。请帮忙
主窗体
public partial class frmMainForm: Form
{
public frmMainForm()
{
InitializeComponent();
}
Thread runningClient;
public MyTcpClient client= new MyTcpClient ();
frmChildForm frmSignIn;
bool clientConnected;
private void frmMainForm_Load(object sender, EventArgs e)
{
clientConnected= false;
panelSidebar.Hide();
if(frmSignIn == null)
{
frmSignIn= new frmChildForm();
frmSignIn.MdiParent = this;
frmSignIn.Show();
}
}
public void TurnOnPanels()
{
panelSidebar.Visible = true;
panelSidebar.BringToFront();
}
public void RequestConnection(string username)
{
string serverRsp = client.Connect(username);
if(serverRsp.Equals("SUCCESS"))
{
MessageBox.Show("Signed In", "Welcome", MessageBoxButtons.OK, MessageBoxIcon.Information);
clientConnected = true;
frmSignIn.Close();
}
}
}
还有我的孩子表格
public partial class frmChildForm : Form
{
frmMainForm frmParent;
Thread clientRunning;
public frmChildForm()
{
InitializeComponent();
frmParent= (frmMainForm)this.MdiParent;
}
private void frmSignIn_FormClosing(object sender, FormClosingEventArgs e)
{
frmParent= (frmMainForm)this.MdiParent;
frmParent.TurnOnPanels();
}
private void btnSignIn_Click(object sender, EventArgs e)
{
if (txtSignInUsername.Text.Equals(""))
{
MessageBox.Show("No empty fields.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
//This is where it fails
clientRunning= new Thread(new ParameterizedThreadStart(frmParent.RequestConnection);
//"No Overload for RequestConnection matches delegate ParameterizedThreadStart"
//If I try to include the parameter inside that call, I get a "waiting for method //name" syntax error message instead.
clientRunning.Start(txtSignInUsername.Text.ToUpper());
}
}
private void frmSignIn_Load(object sender, EventArgs e)
{
frmParent = (frmMainForm)this.MdiParent;
}
}
我还尝试通过在 RequestConnection 中创建一个线程来从主窗体执行此操作,它应该执行 client.Connect,但我遇到了同样的错误。
【问题讨论】:
-
您不能从非 UI 线程创建、访问或更新任何 UI 元素。
标签: c# multithreading winforms tcpclient tcpserver