我的情况很简单但很复杂。我正在尝试编写一个程序,需要执行1100次外部进程,每次执行4次。我完全不知道如何解决这个问题。我正在编写的应用程序是“Windows窗体应用程序”,我正在利用BackgroundWorker来运行异步任务。
示例,我有一个包含1100个不同字符串的列表,我希望每个字符串运行一次该进程,但一次只运行4个,然后继续执行下一个4。
任何帮助都将不胜感激。
答案 0 :(得分:8)
请考虑以下代码:
private async void CodeOnUiThread()
{
//do ui stuff before starting
await ExecuteProcesses();
//do ui stuff after completing.
}
private async Task ExecuteProcesses()
{
await Task.Factory.StartNew(() =>
{
List<string> myStrings = GetMyStrings(); //or whatever you need
Parallel.ForEach(myStrings,
new ParallelOptions()
{
MaxDegreeOfParallelism = 4
}, (s) =>
{
var process = new Process();
process.StartInfo = new ProcessStartInfo("myProcess.exe", s);
process.Start();
process.WaitForExit();
});
});
}
这允许最多4个线程同时运行,因此不允许同时执行4个以上的进程。
<强>更新强>
您还可以使用Environment.ProcessorCount
来获取核心数量。但是,Parallel.ForEach
调用默认情况下会正确处理此问题。
更新2
Parallel.ForEach
将阻止当前运行的线程。我已经更新了上面的代码。
答案 1 :(得分:1)
这个(完整的例子):
class Program
{
static void Main(string[] args)
{
List<StringContainer> strContainers = new List<StringContainer>();
for (int i = 0; i < 1100; i++)
{
strContainers.Add(new StringContainer() { str = "string" + i });
}
Parallel.ForEach(
strContainers,
new ParallelOptions() { MaxDegreeOfParallelism = 4 },
x => ProcessString(x));
foreach (var item in strContainers)
{
Console.WriteLine(item.str);
}
Console.ReadKey();
}
private static void ProcessString(StringContainer strContainer)
{
strContainer.str += "_processed";
}
}
public class StringContainer
{
public string str;
}