限制任务并行库中的线程数
我有几百个文件需要上传到Azure Blob存储。
我想使用并行任务库。
但是,如何在文件列表中以foreach的形式运行所有100个线程,我怎么能限制它可以使用的线程的最大数量并且并行完成作业。 还是它会自动平衡事情?
你根本不应该使用线程。 有一个基于Task
的API,它自然是异步的:CloudBlockBlob.UploadFromFileAsync。 在async/await
和SemaphoreSlim
使用它来限制并行上传的数量。
示例(未测试):
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