[英]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);
}
首先,您應該將response
和resStream
都包裝在using
塊中,以確保它們被正確處理。
其次,在我看來,將長時間運行的線程放入ThreadPool
並不是最好的主意。 ThreadPool
class 的想法是,它允許您將相對較小的操作排隊,而為每個操作生成一個新線程將是浪費的。 如果您的操作需要花費大量時間才能運行,我建議您實際為每個操作創建專用的Thread
對象。
你真的應該打破調試器來找出每個線程在哪里停止,但我的猜測是罪魁禍首是
mySqlManager.SaveResult(tempString);
mySqlManager 似乎是一個 class 屬性,這意味着您需要特別注意線程安全。 確保 SaveResult() 是線程安全的; 如果沒有,那么您需要通過鎖定調用 SaveResult() 線程安全。
祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.