Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在VB.NET中应用并行性来执行保存在一个文件夹中的130个批处理文件?_C#_.net_Vb.net_Visual Studio 2013 - Fatal编程技术网

C# 如何在VB.NET中应用并行性来执行保存在一个文件夹中的130个批处理文件?

C# 如何在VB.NET中应用并行性来执行保存在一个文件夹中的130个批处理文件?,c#,.net,vb.net,visual-studio-2013,C#,.net,Vb.net,Visual Studio 2013,我有130个批处理文件存储在一个中心位置,我想创建VB.NET程序来并行而不是顺序地执行这些批处理文件。然后将这130个批处理文件的输出返回到Textbox控件 我如何满足上述要求?或者推荐的方法是什么,记住程序将在高规格服务器上运行,所以性能不是问题 我所做的是将这个for循环放置在Button_Click事件中,以获取我的.bat名称,然后并行执行它们: Dim目录作为新IO.DirectoryInfo(“C:\Batch\”) 文件名为IO.FileInfo()=目录.GetFiles(“

我有130个批处理文件存储在一个中心位置,我想创建VB.NET程序来并行而不是顺序地执行这些批处理文件。然后将这130个批处理文件的输出返回到Textbox控件

我如何满足上述要求?或者推荐的方法是什么,记住程序将在高规格服务器上运行,所以性能不是问题

我所做的是将这个for循环放置在Button_Click事件中,以获取我的.bat名称,然后并行执行它们:

Dim目录作为新IO.DirectoryInfo(“C:\Batch\”)
文件名为IO.FileInfo()=目录.GetFiles(“*.bat”)
对于文件名中作为IO.FileInfo的每个文件
RichTextBox1.AppendText(文件.ToString()&vbNewLine)
下一个
但是现在,在我得到.dat的名称之后,如何让它们并行执行呢?

注意,我已经用C#回答了这个问题,因为OP将这个问题标记为

您只需使用
任务

List<Task<string>> processTasks = new List<Task<string>>();

for(int i = 0; i < 130; i ++)
{
        Task<string> processTask = Task<string>
        (
            () => 
            {
                 // System.Diagnostics.Process stuff goes here, you should return a string
                 // since it represents the output of the whole process
            }
        );

        processTasks.Add(processTask);
        Task.Run(processTask);
}

// Asynchronously wait for all tasks to finish
await Task.WhenAll(processTasks);

// Now after all tasks have finished, each stored task in "processTasks" 
// will contain a task where their "Result" property is the string representing
// the whole process output
List processTasks=new List();
对于(int i=0;i<130;i++)
{
任务进程任务=任务
(
() => 
{
//System.Diagnostics.Process在此处显示,您应该返回一个字符串
//因为它代表了整个过程的输出
}
);
processTasks.Add(processTask);
运行(processTask);
}
//异步等待所有任务完成
等待任务。WhenAll(处理任务);
//现在,在所有任务完成后,每个存储在“processTasks”中的任务
//将包含一个任务,其中其“Result”属性是表示
//全过程输出

这是我能得到的最接近的,结合了注释和更新的描述

Dim目录作为新IO.DirectoryInfo(“C:\Batch\”)
文件名为IO.FileInfo()=目录.GetFiles(“*.bat”)
作为新列表的Dim列表(字符串)
对于文件名中作为IO.FileInfo的每个文件
list.Add(file.ToString())
下一个
Dim processTasks作为新列表(任务(字符串))()
对于列表中的每个bat作为字符串
Dim processTask As Task(字符串的)=Task.Factory.StartNew((函数)()
Dim filePath为String=IO.Path.Combine(myDirectory.FullName,bat)
作为新系统的Dim信息。Diagnostics.ProcessStartInfo()
info.FileName=文件路径
info.CreateNoWindow=True
info.WindowStyle=ProcessWindowStyle.Hidden
系统.诊断.过程.启动(信息)
回复“你好”
终端功能)
processTasks.Add(processTask)
下一个
'如果您使用的是同步方法
'Dim results(),字符串=Task.WhenAll(processTasks.GetAwaiter().GetResult())
'如果您使用的是异步方法
Dim results()为字符串=等待任务.WhenAll(processTasks)
'将字符串数组作为一个整体使用,或
将每个结果作为结果中的字符串
"对每一个结果都要有所作为,
下一个

并行化是没有意义的,因为一切都取决于从硬盘/硬盘读取数据的速度。@AlexanderPetrov,我认为这取决于批处理文件。如果他们还获取了一些数据或其他他们必须等待的东西,那么并行执行是有意义的。@RonDeijkers-同意。等待作者的澄清。@RonDeijkers你说得对,批处理文件将从特定位置获取一些数据,因此我需要并行执行它,而不是等待第一个作业并转到下一个作业。@AlexanderPetrov批处理文件将从特定位置获取一些数据,为此,我需要并行执行它,而不是等待第一个作业并转到下一个作业。感谢您的快速回复,但是,在这里,我必须将每个批处理文件名放入循环中,或者没有简单的方法从中心位置“批处理文件名为编号”提取它们?在每个任务完成后,如何将结果输出到每个已执行批处理文件的文本框中?(1)用所需内容替换for循环。例如,文件名列表的
foreach
。(2) 我在整个答案中都告诉过你!!在等待所有
processTasks
之后,只需使用
Task.Result
@Omran在每个
Task
实例中获取结果,如果它们实际上是文件,为什么不使用Directory类来获取所有文件名?@cfrozendath,确切地说,我已经执行了以下操作来获取所有.bat文件,但是,对于文件名RichTextBox1.AppendText(file.ToString()&vbNewLine)中的每个文件,我不知道Matias Dim Directory作为新IO.DirectoryInfo(“c:\”)Dim fileName作为IO.FileInfo()=Directory.GetFiles(“*.bat”)在上述共享代码中的位置 Next@Omran如果您不介意编辑您的问题并添加您现在拥有的代码,我会给您一个答案(在VB.NET中有点生疏,但会尝试)我已经运行了上述代码,但最终会出现以下错误:System.dll中发生了“System.ComponentModel.Win32Exception”类型的异常,但未在用户代码中处理其他信息:系统找不到该文件specified@Omran再查一下,,忘了将路径添加到folder@cFtozenDeath-现在我收到此错误。mscorlib.dll中发生了“System.ArgumentException”类型的异常,但未在用户代码中处理。其他信息:路径中的字符非法。@Omran您确定使用的是完全相同的代码吗?检查“列表”是否不包含任何非法字符,如/^&etcnow它工作正常,但我想在这里隐藏所有cmd窗口&结果应发送到textbox,可以吗?