使用Socket时Windows窗体GUI冻结

时间:2009-07-29 11:32:09

标签: c# winforms sockets

当我尝试显示从套接字读取的数据时,我的GUI正在冻结。当我显示一条或两条消息时,只有当我收到许多消息(每秒2-3个)时,它才会冻结。我正在使用异步套接字(非阻塞)。我想这与我如何向gui显示数据有关。代码:

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(..)。正如我所说它工作正常,但不是我一次收到很多消息。

有人有想法吗?

3 个答案:

答案 0 :(得分:2)

查看代码,我的猜测是,从套接字读取数据的网络类不在单独的线程上。我将使用BackgroundWorker类来运行套接字数据,然后调用ProgressChanged将数据带回GUI。 Here是如何设置BackgroundWorker以运行作业和更新GUI的一个很好的示例。

答案 1 :(得分:0)

无论您在何处放置网络代码,如果您每秒多次更新TextBox,您的界面将无法响应。

考虑可能在网络线程中缓冲消息,并使用计时器仅每秒更新一次TextBox。

答案 2 :(得分:0)

还记得在从其他线程调用gui控件的更新时检查InvokeRequired。