C# 使用阻塞队列和后台工作程序访问数据库并下载图像

C# 使用阻塞队列和后台工作程序访问数据库并下载图像,c#,multithreading,queue,C#,Multithreading,Queue,我有以下代码从数据库中获取图像,并将其保存到计算机上的某个文件夹中 using (SqlConnection connection = new SqlConnection(connectionstring)) { connection.Open(); using (SqlCommand cm = new SqlCommand("query", connection)) { t

我有以下代码从数据库中获取图像,并将其保存到计算机上的某个文件夹中

 using (SqlConnection connection = new SqlConnection(connectionstring))
        {
            connection.Open();
            using (SqlCommand cm = new SqlCommand("query", connection))
            {
                t1.Load(cm.ExecuteReader());
                foreach (DataRow row in t1.Rows)
                {
                    fileNames.Add(row["Filename"].ToString());
                }
            }
        }
        BackgroundWorker bgWorker = (BackgroundWorker)sender;

        string baseUrl = "http://some path;
        //int numIterations = 5;

        HttpWebRequest request = null;
        foreach (var fileName in fileNames)
        {
            //if (bw.CancellationPending == true)
            //{
            //    e.Cancel = true;
            //    break;
            //}
            //else
            //{

                string url = string.Format(baseUrl, fileName);
                request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "GET";
                request.ContentType = "application/x-www-form-urlencoded";
                request.CookieContainer = container;

                response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                Image img = Image.FromStream(stream);
               /* Queue<System.Drawing.Image> queImage = new Queue<System.Drawing.Image>(10);

                 queImage.Add(img); */


                img.Save("C:\\some path" + fileName);
使用(SqlConnection连接=新的SqlConnection(connectionstring))
{
connection.Open();
使用(SqlCommand cm=newsqlcommand(“查询”,连接))
{
t1.Load(cm.ExecuteReader());
foreach(t1.Rows中的数据行)
{
添加(行[“Filename”].ToString());
}
}
}
BackgroundWorker bgWorker=(BackgroundWorker)发送方;
字符串baseUrl=”http://some 路径
//整数=5;
HttpWebRequest请求=null;
foreach(文件名中的var文件名)
{
//if(bw.CancellationPending==true)
//{
//e.取消=真;
//中断;
//}
//否则
//{
stringurl=string.Format(baseUrl,文件名);
request=(HttpWebRequest)WebRequest.Create(url);
request.Method=“GET”;
request.ContentType=“application/x-www-form-urlencoded”;
request.CookieContainer=容器;
response=(HttpWebResponse)request.GetResponse();
Stream=response.GetResponseStream();
Image img=Image.FromStream(stream);
/*Queue queImage=新队列(10);
queImage.Add(img)*/
img.Save(“C:\\some path”+文件名);
这是阻塞队列的代码

    class Queue<T>
        {
            private ConcurrentQueue<T> queue = new ConcurrentQueue<T>();
            private int maxSize;


            public Queue(int maxSize)
            {
                this.maxSize = maxSize;
            }

            internal void Add(T item)
            {
                lock (queue)
                {
                    while (queue.Count >= maxSize)
                    {
                        Monitor.Wait(queue);
                    }
                    queue.Enqueue(item);
                    if (queue.Count == 1)
                    {
                        // wake up any blocked dequeue
                        Monitor.PulseAll(queue);
                    }
                }
            }
            internal void Remove(T item)
            {
                lock (queue)
                {
                    while (queue.Count == 0)
                    {
                        Monitor.Wait(queue);
                    }

                    queue.TryDequeue(out item);
                    if (queue.Count == maxSize - 1)
                    {
                        // wake up any blocked enqueue
                        Monitor.PulseAll(queue);
                    }

                }
            }
类队列
{
私有ConcurrentQueue=新ConcurrentQueue();
私有int-maxSize;
公共队列(int-maxSize)
{
this.maxSize=maxSize;
}
内部作废添加(T项)
{
锁(队列)
{
while(queue.Count>=maxSize)
{
监视器。等待(队列);
}
排队。排队(项目);
如果(queue.Count==1)
{
//唤醒任何阻塞的队列
Monitor.pulsell(队列);
}
}
}
内部空隙清除(T项)
{
锁(队列)
{
while(queue.Count==0)
{
监视器。等待(队列);
}
queue.TryDequeue(out项);
if(queue.Count==maxSize-1)
{
//唤醒任何阻塞的队列
Monitor.pulsell(队列);
}
}
}
我想实现多线程,以便更快地访问图像。想法是从数据库中获取数据(尤其是链接到原始图像的filanames)并将其保存在队列中。队列限制为20。一个线程执行此任务。而其他线程则逐个访问此队列中的图像并对其执行操作

我有阻止队列的代码,我不确定是否正确。我曾尝试实现此队列,但我不太确定应该如何实现。可以在?8…*/part之间找到实现。我知道我必须使用thread类创建线程,但不确定应该将哪个方法作为参数传递给ThreadStart。是否有人可以帮我弄清楚这些事情

  • 在哪里装线,用哪种方法通过
  • 如何利用队列执行预期操作

  • 您可以将Task Parallel Library与一起使用。文档中有一个示例