如何停止UI冻结?

我为我的大学学位创建了一个远程管理工具。我目前确实停留在我的代码中的一个错误,并且想知道是否有人可以阐明我的问题。


我有应用程序,服务器和客户端。服务器运行正常。但是,客户端是冻结的应用程序。


在连接到服务器之前,客户端可以正常工作。连接到服务器后,客户端将不断冻结在屏幕上。


我已将错误缩小到特定的代码段,而没有运行该代码的应用程序就不会冻结。但是,该应用程序也不起作用。


这是该代码的示例:


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之外,该应用程序中的所有内容都可以正常工作。


这确实令人沮丧,并且我看不到任何导致应用程序冻结的代码有任何错误。


慕哥6287543
浏览 138回答 3
3回答

慕工程0101907

因此为此解决了一些问题,没有使用异步,但是我最终为此任务创建了一个不同的线程。新线程让我使用了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();        }    }这足以满足我的需要。
打开App,查看更多内容
随时随地看视频慕课网APP