有一个包含100个字符串URI的字符串数组myDownloadList。我想启动5个线程作业,它们将从myDownloadList(如堆栈)弹出下一个URI并对其执行某些操作(下载它),直到堆栈上没有剩余URI(myDownloadList)。
这样做的最佳做法是什么?
答案 0 :(得分:6)
使用ThreadPool,然后设置所有请求。 ThreadPool会自动安排它们。
使用任务并行库,.NET 4将变得更容易。将每个请求设置为Task非常有效且容易。
答案 1 :(得分:1)
确保每个线程在访问时锁定myDownloadList。您可以使用递归来获取最新的,然后当列表为0时,它可以停止该功能。
请参阅下面的示例。
public static List<string> MyList { get; set; }
public static object LockObject { get; set; }
static void Main(string[] args)
{
Console.Clear();
Program.LockObject = new object();
// Create the list
Program.MyList = new List<string>();
// Add 100 items to it
for (int i = 0; i < 100; i++)
{
Program.MyList.Add(string.Format("Item Number = {0}", i));
}
// Start Threads
for (int i = 0; i < 5; i++)
{
Thread thread = new Thread(new ThreadStart(Program.PopItemFromStackAndPrint));
thread.Name = string.Format("Thread # {0}", i);
thread.Start();
}
}
public static void PopItemFromStackAndPrint()
{
if (Program.MyList.Count == 0)
{
return;
}
string item = string.Empty;
lock (Program.LockObject)
{
// Get first Item
item = Program.MyList[0];
Program.MyList.RemoveAt(0);
}
Console.WriteLine("{0}:{1}", System.Threading.Thread.CurrentThread.Name, item);
// Sleep to show other processing for examples only
System.Threading.Thread.Sleep(10);
Program.PopItemFromStackAndPrint();
}