为了账号安全,请及时绑定邮箱和手机立即绑定

如何停止UI冻结?

如何停止UI冻结?

C#
慕哥6287543 2021-04-15 14:15:33
我为我的大学学位创建了一个远程管理工具。我目前确实停留在我的代码中的一个错误,并且想知道是否有人可以阐明我的问题。我有应用程序,服务器和客户端。服务器运行正常。但是,客户端是冻结的应用程序。在连接到服务器之前,客户端可以正常工作。连接到服务器后,客户端将不断冻结在屏幕上。我已将错误缩小到特定的代码段,而没有运行该代码的应用程序就不会冻结。但是,该应用程序也不起作用。这是该代码的示例:private static void ReceiveResponse()    {        var buffer = new byte[2048]; //The receive buffer        try        {            int received = 0;            if (!IsLinuxServer) received = _clientSocket.Receive(buffer, SocketFlags.None); //Receive data from the server            else received = _sslClient.Read(buffer, 0, 2048);            if (received == 0) return; //If failed to received data return            var data = new byte[received]; //Create a new buffer with the exact data size            Array.Copy(buffer, data, received); //Copy from the receive to the exact size buffer            if (isFileDownload) //File download is in progress            {                Buffer.BlockCopy(data, 0, recvFile, writeSize, data.Length); //Copy the file data to memory                writeSize += data.Length; //Increment the received file size                if (writeSize == fup_size) //prev. recvFile.Length == fup_size                {                    using (FileStream fs = File.Create(fup_location))                    {                        Byte[] info = recvFile;                        // Add some information to the file.                        fs.Write(info, 0, info.Length);                    }                    Array.Clear(recvFile, 0, recvFile.Length);                    SendCommand("frecv");                    writeSize = 0;                    isFileDownload = false;                    return;                }            }此代码是用户从服务器接收请求的方式。因此,它是每100毫秒运行一次的计时器。我想知道计时器是否与此有关。在进入While(true)循环之前,我遇到了相同的问题,这使我认为这是导致UI冻结的实际代码。即使应用程序被冻结,该代码仍然可以正常工作,除了UI之外,该应用程序中的所有内容都可以正常工作。这确实令人沮丧,并且我看不到任何导致应用程序冻结的代码有任何错误。
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

因此为此解决了一些问题,没有使用异步,但是我最终为此任务创建了一个不同的线程。


新线程让我使用了while(true)循环来永远循环接收响应。


private void btnConnect_Click(object sender, EventArgs e)

    {

        ConnectToServer();

        Thread timerThread = new Thread(StartTimer);

        timerThread.Start();

        //StartTimer();

        //timerResponse.Enabled = true;


    }

    private static void StartTimer()

    {

        while (true)

        {

            ReceiveResponse();

        }

    }

这足以满足我的需要。


查看完整回答
反对 回复 2021-04-24
  • 3 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信