使用TPL数据流转换文件

时间:2015-11-30 08:15:18

标签: c# task-parallel-library tpl-dataflow

我有以下问题。假设我有一个字符串列表实际上是xls excel文件的URL,我试图将它们全部下载并将它们转换为xlsx,因为我使用的是Microsoft兼容包,我不能在下载后使用转换器文件,因为我不希望一次运行多个进程,并且大约有1600个文件,所以我真的不希望那么多进程按顺序执行它可能会永远持续下去。
我试图通过使用TPL数据流来改进我的代码,因为我认为这种情况非常适合生产者 - 消费者一样的模式,并且互联网提示TPL数据流是我需要的,但可能我误解了教程中的一些东西我是阅读,因为以下代码不起作用。我究竟做错了什么 ?

var pathsBuffer = new BufferBlock<string>(new DataflowBlockOptions 
{
    BoundedCapacity = 12
});

var converterOptions = new ExecutionDataflowBlockOptions 
{
    MaxDegreeOfParallelism = 4
};

var converter = new ActionBlock<string>((filePath) => 
{
    Process.Start(@"c:\Program Files (x86)\Microsoft Office\Office12\excelcnv.exe",
    string.Format(@" -nme -oice {0} {1}", filePath, filePath + "x")).WaitForExit();
}, converterOptions);
pathsBuffer.LinkTo(converter);
pathsBuffer.Completion.ContinueWith(task => converter.Complete());
Parallel.ForEach(FileAdress, async(file) => 
{
    using(var webClient = new WebClient()) 
    {
        string OutputDirectory = ConfigurationManager.AppSettings["RootDirectory"] + 
                                 FolderIndex;
        if (!Directory.Exists(OutputDirectory)) 
        {
            Directory.CreateDirectory(OutputDirectory);
        }
        string filePath = Path.Combine(OutputDirectory, AdressIndex[file]);
        await webClient.DownloadFileTaskAsync(new Uri(file), filePath);

        while (!pathsBuffer.Post(filePath)) {}
    }
});
pathsBuffer.Complete();

0 个答案:

没有答案