簡體   English   中英

C# ThreadPool 一個線程阻塞其他?

[英]C# ThreadPool one thread blocks other?

我有一個 C# 控制台應用程序,其中有一個線程池。 在線程池中將有一個 class 執行連續方法(直到它運行了一段時間或知道何時停止)。 該方法連接到 HttpWebResponse stream 並繼續使用它。

問題是在短時間內所有線程都在做他們的事情,但只有一個線程繼續顯示它是 output 並且 rest 正在等待該線程。

這是為每個線程執行的方法。

function void ReadStream()
        byte[] buf = new byte[8192];

        String domain = streamingUrl

        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(domain);
        HttpWebResponse response = (HttpWebResponse)
        request.GetResponse();

        Stream resStream = response.GetResponseStream();

        string tempString = null;
        int count;
        do
        {
            // fill the buffer with data
            count = resStream.Read(buf, 0, buf.Length);

            if (count != 0)
            {
                tempString = Encoding.ASCII.GetString(buf, 0, count);

                try
                {
                    mySqlManager.SaveResult(tempString);

                    Console.WriteLine("Been here");
                    Thread.Sleep(1000);
                }
                catch (Exception e)
                {
                }
            }
        }
        while (count > 0);
    }

首先,您應該將responseresStream都包裝在using塊中,以確保它們被正確處理。

其次,在我看來,將長時間運行的線程放入ThreadPool並不是最好的主意。 ThreadPool class 的想法是,它允許您將相對較小的操作排隊,而為每個操作生成一個新線程將是浪費的。 如果您的操作需要花費大量時間才能運行,我建議您實際為每個操作創建專用的Thread對象。

你真的應該打破調試器來找出每個線程在哪里停止,但我的猜測是罪魁禍首是

mySqlManager.SaveResult(tempString);

mySqlManager 似乎是一個 class 屬性,這意味着您需要特別注意線程安全。 確保 SaveResult() 是線程安全的; 如果沒有,那么您需要通過鎖定調用 SaveResult() 線程安全。

祝你好運!

暫無
暫無

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

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