我正在开发一个C#windows应用程序。该应用程序主要与套接字有关。
我有一个名为tcpsocket的类,它处理发送,接收数据等所有套接字级功能。控制器类调用此tcpsocket。此外,它还执行将数据记录到文件和更新GUI的所有其他工作。我认为在后台工作中安装这个控制器会很好,以确保gui始终响应。首先,这样做是个好主意吗?
当我试图这样做时,我面临着关于后台工作者的progresschanged处理程序的问题。我希望能够在文本字段中显示连接状态(类型:字符串),并在richTextBox中显示应用程序发送/接收的数据(类型:字节[])。由于控制器只能通过progressChanged事件向gui发送数据,我如何将不同类型的数据(String / byte [])传递给gui?
答案 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.
享受!