我正在编写一个应用程序,其中有一个包含2个方法和一些字段的类Rechnungsleser
。
字段:
invoices = new BlockingCollection<Invoice>(new ConcurrentQueue<Invoice>());
// Total number of invoices in the XML
invoicesToProcess = XDocument.Load(sourceFile).Root.Elements().Count();
// Number of invoices consumed
invoicesProecessed = 0;
public void ReadRechnungslauf() (below)
using (XmlReader rechnungsreader = XmlReader.Create(sourceFile))
{
// Iterate over whole file
while (!rechnungsreader.EOF)
{
if (someCondition)
{
XElement rechnung = XNode.ReadFrom(rechnungsreader) as XElement;
// Some minor change
Helper.RemoveAllNamespaces(rechnung);
if (rechnung != null)
{
try
{
// Decent change, takes XElement, reads and changes some Elements, return object of type Invoice
invoices.Add(CreateRechnung(rechnung, possibleOverlays));
}
catch (Exception e)
{
Log(e)
throw;
}
}
}
else
{
rechnungsreader.Read();
}
}
}
public void ProcessRechnungslauf()
{
Rechnung currentRechnung;
// Check that all invoices are processed
while (invoicesToProcess != invoicesProecessed)
{
// Take next enqueued item
currentRechnung = rechnungen.Take();
if (currentRechnung.PrintMode.Equals("Online"))
{
// Very computing heavy method
printer.PrintRechnung(currentRechnung);
}
invoicesProcessed++;
}
}
我这样初始化两个方法:
using (Rechnungsleser reader = new Rechnungsleser()
{
Task readingTask = Task.Factory.StartNew(() =>
{
reader.ReadRechnungslauf();
});
Task processingTask = Task.Factory.StartNew(() =>
{
reader.ProcessRechnungslauf();
});
Task.WaitAll(readingTask, processingTask);
}
当我检查日志时,它首先读取所有发票并将其放入队列中,然后开始处理它们。如何确保并行性?仅仅是因为ProcessRechnungslauf()
比ReadRechnungslauf()
需要更高的性能吗?
我应该使用Threads
还是TaskParallelLibrary
?为什么?
我的理解是,Task
从Thread
获取可用的Threadpool
并执行它。我不明白为什么这两个任务不能同时使用。