c#backgroundworker用于套接字应用程序

时间:2010-08-03 14:07:23

标签: c# backgroundworker

我正在开发一个C#windows应用程序。该应用程序主要与套接字有关。

我有一个名为tcpsocket的类,它处理发送,接收数据等所有套接字级功能。控制器类调用此tcpsocket。此外,它还执行将数据记录到文件和更新GUI的所有其他工作。我认为在后台工作中安装这个控制器会很好,以确保gui始终响应。首先,这样做是个好主意吗?

当我试图这样做时,我面临着关于后台工作者的progresschanged处理程序的问题。我希望能够在文本字段中显示连接状态(类型:字符串),并在richTextBox中显示应用程序发送/接收的数据(类型:字节[])。由于控制器只能通过progressChanged事件向gui发送数据,我如何将不同类型的数据(String / byte [])传递给gui?

1 个答案:

答案 0 :(得分:0)

如果决定在UI线程以外的其他线程上运行控制器,则需要将progressChanged事件从控制器挂接到UI线程上的方法处理程序。完成此操作后,您必须将processChanged事件返回的数据封送到UI线程。下面是如何进行编组的示例。

private object _lock = new object(); //should have class scope

private void DispalyMessage(byte[] bytes)
{
  if (this.InvokeRequired)
  {
    lock (_lock)
    {
      EventHandler d = new EventHandler(DispalyMessage);
      this.Invoke(d, new object[] { bytes });
      return;
    }
  }
  else
  {
    //the bytes data has been marshaled from the controller class thread to the ui thread and can be used at will to populate a memeber of the ui.
  }
}

此外,您可能需要修改控制器并添加可能返回类型以外的其他事件:byte []。您可以通过简单地利用作为.net框架一部分的generic delegate类来实现此目的,或者您可以直接利用委托类。 Here is the Microsoft documentation on delegates.

享受!