为什么第二个任务等待第一个任务完成?

时间:2019-03-29 08:46:56

标签: c# multithreading task threadpool blockingcollection

我正在编写一个应用程序,其中有一个包含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?为什么?
我的理解是,TaskThread获取可用的Threadpool并执行它。我不明白为什么这两个任务不能同时使用。

0 个答案:

没有答案