01.
using
System;
02.
using
System.Collections.Generic;
03.
using
System.IO;
04.
using
System.Linq;
05.
using
System.Text;
06.
using
System.Threading;
07.
using
System.Threading.Tasks;
08.
09.
namespace
TaskExam
10.
{
11.
class
Program
12.
{
13.
static
int
runningFolder = -1;
14.
static
List<
string
> folderList;
15.
static
int
MaxTask = 5;
16.
static
Task[] workerTasks;
17.
18.
static
void
Main(
string
[] args)
19.
{
20.
var rootFolder = @
"D:\A_BOOK"
;
21.
folderList = Directory.GetDirectories(rootFolder,
"*"
, SearchOption.AllDirectories).ToList();
22.
23.
if
(folderList.Count == 0)
return
;
24.
if
(folderList.Count > MaxTask)
25.
workerTasks =
new
Task[MaxTask];
26.
else
27.
{
28.
MaxTask = folderList.Count;
29.
workerTasks =
new
Task[MaxTask];
30.
}
31.
32.
var rnd =
new
Random();
33.
Action<
object
> workAction = (
object
path) =>
34.
{
35.
36.
37.
38.
39.
var files = Directory.GetFiles((
string
)path,
"*.*"
, System.IO.SearchOption.TopDirectoryOnly).ToList();
40.
foreach
(
string
s
in
files)
41.
{
42.
Console.WriteLine(
"Task#{0}: {1}"
, Task.CurrentId, s);
43.
}
44.
};
45.
46.
for
(
int
n=0;n<MaxTask;n++)
47.
{
48.
workerTasks[n] =
new
Task(workAction, GetAvailFolder());
49.
workerTasks[n].Start();
50.
}
51.
52.
int
taskNo = Task.WaitAny(workerTasks);
53.
while
(taskNo >= 0)
54.
{
55.
string
path = GetAvailFolder();
56.
if
(
string
.IsNullOrEmpty(path))
break
;
57.
workerTasks[taskNo] =
new
Task(workAction, path);
58.
workerTasks[taskNo].Start();
59.
taskNo = Task.WaitAny(workerTasks);
60.
}
61.
62.
Task.WaitAll(workerTasks);
63.
Console.Read();
64.
}
65.
66.
static
string
GetAvailFolder()
67.
{
68.
string
folder =
string
.Empty;
69.
lock
(folderList)
70.
{
71.
if
(runningFolder < folderList.Count - 1)
72.
{
73.
runningFolder++;
74.
folder = folderList[runningFolder];
75.
}
76.
}
77.
return
folder;
78.
}
79.
}
80.
}