求问一个C#多线程问题,主程序如何等待多个其他子线程完成后继续
基本需求是这样的:有很多网页的图片需要下载我设置为,每个网页的各个图片分别用一个线程同时去下载。
我想知道,代码该怎么写,能实现比如一个页面30个图,都下载完了。然后通知给主线程,然后主线程把图片存一下,然后开子线程现在第2个网页
不知道怎么高效的写这个代码。
我用了非常垃圾的做法,设了一个公共变量(还得加锁)。子线程下载完一个,给这个变量+1。主线程while判断,这个公共变量=要下载的所有数量后,就知道全完成了
我这个方法太辣鸡了。主线程while,导致一个CPU占满 本帖最后由 hrpzcf 于 2022-8-30 12:20 编辑
Task.Run(任务).ContinueWith(线程完成后);
这应是比较简单的了,更复杂的我也不会 Thread Join 委托代{过}{滤}理不行吗.下载好通知后台方法就行了,不用while 各位兄弟,能再详细点么?有没有demo能学习下 我感觉可以加个timer,,然后来进行操作 用线程池去处理. //开始任务
int workThreadCount = 1;
ManualResetEvent[] _ManualEvents = new ManualResetEvent;
for (int i = 0; i < workThreadCount; i++)
{
_ManualEvents = new ManualResetEvent(false);
var name = i + "";
WaitCallback method = (u) => work(u);
ThreadPool.QueueUserWorkItem(method, _ManualEvents);
}
WaitHandle.WaitAll(_ManualEvents);
//任务结束 /// <summary>
/// 真实执行下载的线程
/// </summary>
/// <param name="objPath"></param>
private static void DownLoadPicThread(object objPath)
{
//模拟下载图片
Console.WriteLine($"下载图片:{objPath.ToString()}");
Thread.Sleep(3000);
}
/// <summary>
/// 独立线程,用于启动子线程
/// </summary>
private static void DownloadMain()
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 30; i++)
{
Task task = new Task(DownLoadPicThread, i, TaskCreationOptions.LongRunning);
task.Start();
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
Console.WriteLine("所有线程都已执行完成");
}
static void Main(string[] args)
{
Task taskMain = new Task(DownloadMain);
taskMain.Start();
Console.ReadKey();
} 在这种线程的while里面,你一定要加上sleep以避免cpu占用过高.
对于这个需要,我觉得:
1.你需要对每个任务进行分解,是弄一个列表,比如有30个图,就是30个任务
2.开启指定数量的线程,比如5个,每个线程就是你的一名员工,他会lock任务表,取一个任务,去执行,完成后,回来再去查任务表,直接任务表中没有任务。
网上有个例子: C#多线程-模拟火车票卖票程序
页:
[1]
2