C# Windows窗体GUI在使用套接字时冻结
当前,当我试图显示从套接字读取的数据时,GUI处于冻结状态。只有当我收到很多信息(每秒2-3条)时,当我显示一条或两条信息时,它才不会冻结。我使用的是异步套接字(非阻塞)。我想这与我如何向gui显示数据有关。代码:C# Windows窗体GUI在使用套接字时冻结,c#,winforms,sockets,C#,Winforms,Sockets,当前,当我试图显示从套接字读取的数据时,GUI处于冻结状态。只有当我收到很多信息(每秒2-3条)时,当我显示一条或两条信息时,它才不会冻结。我使用的是异步套接字(非阻塞)。我想这与我如何向gui显示数据有关。代码: public class Globals { public static MainDialog myDialog; } public partial class MainDialog : Form { public MainDialog() {
public class Globals
{
public static MainDialog myDialog;
}
public partial class MainDialog : Form
{
public MainDialog()
{
InitializeComponent();
Globals.myDialog = this;
}
public void sendText(string text)
{
logBox.AppendText(text);
logBox.AppendText("\n");
}
}
然后我只需从我的网络类调用Globals.myDialog.sendText(..)。正如我所说,它工作得很好,但当我一次收到许多消息时就不行了
有人有主意吗 看看代码,我猜从套接字读取数据的网络类不在单独的线程上。我将使用该类运行套接字数据,然后调用ProgressChanged将数据带回GUI。这是如何设置BackgroundWorker以运行作业和升级GUI的一个很好的示例。无论您在何处放置网络代码,如果您每秒多次更新文本框,您的界面将无响应
请考虑在您的网络线程中缓冲消息,并使用计时器每秒仅更新一次文本框。还记得在从其他线程调用gui控件更新时检查所需的调用。异步在引擎盖下执行线程,因此它在单独的线程中。仍然感谢,我已经用InvokeRequired&BeginInvoke修复了它。如果您使用BackgroundWorker,就不需要InvokeRequired,我已经用InvokeRequired&BeginInvoke修复了它。谢谢以前也有过这种情况,只需快速找到所需的属性X-)