使用阻塞队列和后台辅助角色访问数据库和下载映像
本文关键字:角色 访问 数据库 映像 下载 后台 队列 | 更新日期: 2023-09-27 17:55:24
我有以下代码可以从数据库中获取图像并将其保存到计算机上的某个文件夹中。
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);
这是阻止队列的代码
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);
}
}
}
我想实现多线程,以便可以更快地访问图像。想法是从数据库中获取数据(尤其是 filanames,因为它们链接到原始图像)并将它们保存在队列中。让队列限制为 20。一个线程执行此任务。而其他线程则逐个访问此队列中的映像并对其执行操作。
我有用于阻止队列的代码,我不确定是否正确。我已经尝试实现这个队列,但我不太确定我应该如何做到这一点。实现可以在 ?8...*/部分之间找到。我知道我必须使用 Thread 类创建一个线程,但不确定哪个方法应该作为参数传递给 ThreadStart。有人可以帮我弄清楚这些事情吗?
- 在哪里装箱线程以及传递哪种方法?
- 如何利用队列来执行预期的操作?
您可以将任务并行解放与BlockingCollection<T>
一起使用。文档中有一个示例。