同时运行给定数量的相同进程

时间:2014-01-08 13:58:53

标签: c# multithreading backgroundworker

我的情况很简单但很复杂。我正在尝试编写一个程序,需要执行1100次外部进程,每次执行4次。我完全不知道如何解决这个问题。我正在编写的应用程序是“Windows窗体应用程序”,我正在利用BackgroundWorker来运行异步任务。

示例,我有一个包含1100个不同字符串的列表,我希望每个字符串运行一次该进程,但一次只运行4个,然后继续执行下一个4。

任何帮助都将不胜感激。

2 个答案:

答案 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;
}