C# 在.Net中并行地拉入和推送数据

C# 在.Net中并行地拉入和推送数据,c#,database,multithreading,parallel-processing,task-parallel-library,C#,Database,Multithreading,Parallel Processing,Task Parallel Library,到目前为止,我只写过单核程序。现在我想提高我的性能,并尝试找出如何并行地拉入和推送数据。但是我甚至不知道我对多线程是否有正确的想法 事实上,这是一个相当简单的案例。我从一个外部接口中提取数据,对它们进行返工,使它们处于正确的顺序,然后将它们推送到OpenGL管道中以绘制它们 我使用WPF应用程序作为GUI,并使用SharpGL(OpenGL wrapped)呈现数据。该程序在双核处理器上运行 这是我的愿景的草图 所以我的想法是使用缓冲阵列。现在的线索是:我如何在同一个数组中从不同的色雷斯读写

到目前为止,我只写过单核程序。现在我想提高我的性能,并尝试找出如何并行地拉入和推送数据。但是我甚至不知道我对多线程是否有正确的想法

事实上,这是一个相当简单的案例。我从一个外部接口中提取数据,对它们进行返工,使它们处于正确的顺序,然后将它们推送到OpenGL管道中以绘制它们

我使用WPF应用程序作为GUI,并使用SharpGL(OpenGL wrapped)呈现数据。该程序在双核处理器上运行

这是我的愿景的草图

所以我的想法是使用缓冲阵列。现在的线索是:我如何在同一个数组中从不同的色雷斯读写

建议我通知OpenMP。但事实证明,这对.Net和C#来说并不是一个好主意


因此,您能推荐一些合适的纸张吗?也许可以解释一下如何在这种情况下使用任务并行库(TPL)。

正确的描述是生产者-消费者模式。在.Net中,您可以使用

另一个实现可以使用。基本版本:

BlockingCollection<int> bc = new BlockingCollection<int>();

async Task Main()
{
    // Fire up two readers
    Task.Run(() => ReadCollection1());
    Task.Run(() => ReadCollection2());

    // Add items to process.
    bc.Add(5);
    bc.Add(6);
    bc.Add(7);
    bc.Add(8);
    bc.Add(9);

    bc.CompleteAdding(); // Signal we are finished adding items (on close of application for example)
}

void ReadCollection1()
{
    foreach (var item in bc.GetConsumingEnumerable()) 
    {
        $"1 processed {item}".Dump();
    }
}


void ReadCollection2()
{
    foreach (var item in bc.GetConsumingEnumerable()) 
    {
        $"2 processed {item}".Dump();
    }
}
BlockingCollection bc=new BlockingCollection();
异步任务Main()
{
//激发两个读者
运行(()=>ReadCollection1());
运行(()=>ReadCollection2());
//添加要处理的项目。
bc.增加(5);
bc.增加(6);
bc.增补(7);
bc.增补(8);
bc.增补(9);
bc.CompleteAdding();//表示我们已完成添加项(例如,在应用程序关闭时)
}
void ReadCollection1()
{
foreach(bc.GetConsumingEnumerable()中的变量项)
{
$“1已处理{item}.Dump();
}
}
void ReadCollection2()
{
foreach(bc.GetConsumingEnumerable()中的变量项)
{
$“2已处理{item}.Dump();
}
}