簡體   English   中英

線程c#中的CPU使用率高

[英]High CPU usage in thread c#

嗨,我在運行此線程時的CPU使用率很高(15-16%),除非“ ssStop”設置為true(有效),否則該線程應該一直循環運行,但是在運行時我打開了該線程任務管理器,我看到該程序正在消耗15%的計算機處理能力,一旦退出線程,它就會下降到1-2%。 即使在使用EventWaitHandle時(我發現它在網上搜索此問題)仍然保持很高的水平,有人知道我在做什么錯嗎?:

public void Receive()
{
    try
    {              
        bool firstTimeRun = true;
        TcpListener ssTcpListener = new TcpListener(IPAddress.Any, 1500);
        TcpClient tcpReceiver;
        ssTcpListener.Start();
        while (!ssStop)
        {
            //Start listening for connection.
            //Accept any incoming connection requests on port 1500.
            tcpReceiver = new TcpClient();
            if (ssTcpListener.Pending())
            {
                tcpReceiver = ssTcpListener.AcceptTcpClient();
            }
            if (tcpReceiver.Connected)
            {
                //looped for first time; receives whole image.
                if (firstTimeRun)
                {
                    //TCP connected. Receive images from contact
                    NetworkStream receivedNs = new NetworkStream(tcpReceiver.Client);
                    Bitmap image = new Bitmap(receivedNs);
                    receivedImage = image;
                    pboScrnShare.Image = image;
                    receivedNs.Flush();
                    firstTimeRun = false;                            
                }
                //second time or higher looped; receives difference and overlays it.
                else if (!firstTimeRun)
                {
                    NetworkStream receivedNs = new NetworkStream(tcpReceiver.Client);

                    //Put image into picturebox.
                    receivedImage2 = new Bitmap(receivedNs);
                    receivedImage2.MakeTransparent(Color.Black);
                    Bitmap overlayedImage = new Bitmap(receivedImage.Width, receivedImage.Height);

                    using (Graphics gr = Graphics.FromImage(overlayedImage))
                    {
                        gr.DrawImage(receivedImage, new Point(0, 0));
                        gr.DrawImage(receivedImage2, new Point(0, 0));
                    }


                    try
                    {
                        pboScrnShare.Image = overlayedImage;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "pbo second run");
                    }
                    receivedImage2.Dispose();
                    if (this.InvokeRequired) { this.Invoke(new MethodInvoker(delegate() { receivedImage = overlayedImage; })); } else { receivedImage = overlayedImage; }
                    receivedNs.Flush();
                }
                tcpReceiver.Close();
            }
            myEventWaitHandle.WaitOne(10, true);
        }
        ssTcpListener.Stop();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(), "Invited ReceiveSS()", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

您正在刻錄CPU周期,忙於輪詢連接。 考慮到Pending返回false的大部分時間,您的循環像這樣旋轉:

while (!ssStop)
{
    tcpReceiver = new TcpClient();
    myEventHandle.WaitOne(10, false);
}

現在,如果未設置myEventHandle,則WaitOne的10ms延遲將有效地限制執行,但我的猜測是該事件已設置,以便WaitOne立即返回true

不需要輪詢連接,因為AcceptTcpClient將阻止等待連接。 因此,如果您稍微更改了代碼,它應該可以按預期工作:

while (!ssStop)
{
    TcpClient tcpReceiver = ssTcpListener.AcceptTcpClient(); // this blocks
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM