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与一起使用。文档中有一个示例