C#线程池一个线程阻塞另一个线程

本文关键字:线程 一个 另一个 | 更新日期: 2023-09-27 17:59:04

我有一个C#控制台应用程序,其中有一个线程池。在线程池中,会有一个类执行一个连续的方法(直到它运行了一段时间或知道何时停止)。该方法连接到HttpWebResponse流并继续对其进行重新编码

问题是,在很短的一段时间内,所有线程都只做自己的事情,但只有一个线程继续显示它的输出,其余的线程都在等待那个线程。

这是为每个线程执行的方法。

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);
    }

C#线程池一个线程阻塞另一个线程

首先,应该将responseresStream都封装在using块中,以确保它们得到正确处理。

其次,在我看来,将长时间运行的线程放在ThreadPool中并不是最好的主意。ThreadPool类的思想是,它允许您对相对较小的操作进行排队,在这些操作中,为每个操作生成一个新线程将是浪费。如果您的操作需要花费大量时间才能运行,我建议您实际为每个操作创建专用的Thread对象。

你真的应该闯入调试器,找出每个线程的停止位置,但我猜罪魁祸首是

mySqlManager。SaveResult(tempString);

mySqlManager似乎是一个类属性,这意味着您需要特别注意线程安全。请确保SaveResult()是线程安全的;如果没有,那么您需要通过锁定使对SaveResult()的调用线程安全。

祝你好运!