MDI表单从OnClientConnect静态方法

本文关键字:静态方法 OnClientConnect 表单 MDI | 更新日期: 2023-09-27 18:16:56

我正在编写客户端服务器应用程序,我的服务器是WinForm。我正在尝试从静态方法创建子表单,如

private static void OnClientConnect(IAsyncResult asyn)
{
    try
    {
        TcpClient clientSocket = default(TcpClient);
        clientSocket = _listener.EndAcceptTcpClient(asyn);
        clientSocket.ReceiveBufferSize = 1024;
        frmClient frmClient = new frmClient(clientSocket);
        frmClient.Show(this);               
    }
    catch (Exception se)
    {
        throw;
    }
    WaitForClientConnect();
}

但是"this"不被接受,因为我在静态方法中使用它。

我也尝试创建一个静态字段来保存它并使用它。但是也会抛出跨线程异常。

有什么建议?

MDI表单从OnClientConnect静态方法

您可以将MDI父窗口存储在静态变量中,如

public static Form RootForm;

然后你可以显示一个新的MDI子线程,像这样考虑交叉线程。

public static void ShowFormForClient(TcpClient clientSocket) {
  // check if we are on a different thread and redirect if so
  if (RootForm.InvokeRequired) {
     RootForm.Invoke((MethodInvoker) delegate { ShowFormForClient(clientSocket); });
     return;
  }
  var frmClient = new frmClient(clientSocket);
  frmClient.MdiParent = RootForm;
  frmClient.Show();
}

请注意,这段代码没有以任何方式进行测试,仅用于演示。