我在.NET 3.5应用程序中遇到了问题,并且在开始时我想回答 - 不,我无法迁移到.NET 4.5 - 因此无法使用任务并行库。c中的线程管理器#
客户期望: - 当用户进入项目时,应该生成PDF并保存到数据库(当用户点击按钮时,应用程序应该立即响应)。
基于线程池,在那里我委派任务,使我实现了解决方案:
线程池()=> RenderPDF ...
,一切运作良好,但是当客户做测试,火十个不同的项目与巨大的PDF呈现在同一时间,没有任何线程是完整的。
我想问一下,如果是一个好的方法来让一些管理员能够在这个时候只触发一个任务,如果PDF渲染高于某个尺寸? 我正在考虑像队列管理器这样的东西?这是好方法吗?要生成PDF的我使用第三方DLL(XMLTOPDF)。
编辑:
你能再帮忙吗?我一直试图几乎整个晚上,结果是...,没有结果,但我相信,我正在路上,我只需要更多expirenced的人的帮助:)
根据你的意见,我添加了代码的Global.asax:
protected void Application_BeginRequest(Object source, EventArgs e)
{
if (!Config.Initialized)
{
ThreadManager.Init();
}
}
这里是我ThreadManager类:
3210当然,你的BlockingQueue类:
public class BlockingQueue<T>
{
private readonly Queue<T> Queue;
private readonly object Lock;
public BlockingQueue()
{
Queue = new Queue<T>();
Lock = new object();
}
public void Enqueue(T Item)
{
lock (Lock)
{
Queue.Enqueue(Item);
Monitor.Pulse(Lock);
}
}
public T Dequeue()
{
lock (Lock)
{
while (Queue.Count == 0)
Monitor.Wait(Lock);
return Queue.Dequeue();
}
}
}
最后我的方法,其中新项目添加到队列:
protected void btnGeneratePdf_Click(object sender, EventArgs e)
{
byte[] arr = new byte[100];
ThreadManager.RenderingQueue.Enqueue(arr);
ThreadManager.RenderingQueue.Enqueue(arr);
ThreadManager.RenderingQueue.Enqueue(arr);
}
}
当先做项目被添加到队列中,排队方法激发Monitor.Pulse(锁定),然后一切都很好。 但是,当添加第二个项目时,Enqueue方法也会触发Monitor.Pulse(锁定),但不幸的是,在StartThread()中的线程已结束。 如何解决它?我想像while(RenderingQueue.Dequeue()),但它不返回布尔。
听起来像是你可能想看看像MSMQ(或一些其他类型的消息队列)。 – dana
这些PDF生成过程是否共享一些资源?数据库,网络,例如.. –
不,他们不如果我理解的很好。 – tylkonachwile