限制任务并行库中的线程数

我有几百个文件需要上传到Azure Blob存储。
我想使用并行任务库。
但是,如何在文件列表中以foreach的形式运行所有100个线程,我怎么能限制它可以使用的线程的最大数量并且并行完成作业。 还是它会自动平衡事情?


你根本不应该使用线程。 有一个基于Task的API,它自然是异步的:CloudBlockBlob.UploadFromFileAsync。 在async/awaitSemaphoreSlim使用它来限制并行上传的数量。

示例(未测试):

const MAX_PARALLEL_UPLOADS = 5;

async Task UploadFiles()
{
    var files = new List<string>();
    // ... add files to the list

    // init the blob block and
    // upload files asynchronously
    using (var blobBlock = new CloudBlockBlob(url, credentials))
    using (var semaphore = new SemaphoreSlim(MAX_PARALLEL_UPLOADS))
    {
        var tasks = files.Select(async(filename) => 
        {
            await semaphore.WaitAsync();
            try
            {
                await blobBlock.UploadFromFileAsync(filename, FileMode.Create);
            }
            finally
            {
                semaphore.Release();
            }
        }).ToArray();

        await Task.WhenAll(tasks);
    }
}

你尝试使用MaxDegreeOfParallelism吗? 喜欢这个:

System.Threading.Tasks.Parallel.Invoke(
new Tasks.ParallelOptions {MaxDegreeOfParallelism =  5 }, actionsArray)

你可以通过运行这个来找到:

class Program
{
    static void Main(string[] args)
    {
        var list = new List<int>();

        for (int i = 0; i < 100; i++)
        {
            list.Add(i);
        }

        var runningIndex = 0;

        Task.Factory.StartNew(() => Action(ref runningIndex));

        Parallel.ForEach(list, i =>
        {
            runningIndex ++;
            Console.WriteLine(i);
            Thread.Sleep(3000);
        });

        Console.ReadKey();
    }

    private static void Action(ref int number)
    {
        while (true)
        {
            Console.WriteLine("worked through {0}", number);
            Thread.Sleep(2900);
        }
    }
}

正如你所看到的,并行的数量在开始时较小,变得越来越大,并且在结束时越来越小。 所以肯定会有某种自动优化。

链接地址: http://www.djcxy.com/p/50167.html

上一篇: Limit number of Threads in Task Parallel Library

下一篇: level parallelism from gradle's project