111,092
社区成员




private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10000; i++)
{
tasks[i] = "任务" + (i + 1);//加载模拟的任务 实际业务当中有很多代码 这里只是模拟
}
}
Stopwatch timer = new Stopwatch();//new一个stopwatch
string[] tasks = new string[10000];
private void button2_Click(object sender, EventArgs e)
{
timer.Start();//开始计算时间
//for (var i = 0; i < 12; i++)//注释了这句代码 就是单线程,但是执行的时间和多线程几乎一样,多次测试都是
new Thread(h => DoIt()).Start();
}
int index=0;
int ttindex=0;
private void DoIt()
{
while(true)
{
string task;
lock (tasks)
{
if (index >= tasks.Length) //所有任务都完成了
{
timer.Stop();//结束点,另外stopwatch还有Reset方法,可以重置。
Console.WriteLine(timer.Elapsed);//显示时间
Console.WriteLine(timer.ElapsedMilliseconds);// 显示到毫秒
break;
}
task = tasks[index++];
ttindex++;
Console.WriteLine("索引"+ttindex);
}
var tid = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("正在执行{0}_线程id={1}", task, tid);
//Thread.Sleep(1); //随机阻塞一会儿
Console.WriteLine("{0}结束", task);
}
}
for (int i = 0; i < 10000; i++)
{
tasks[i] = "任务" + (i + 1);//加载模拟的任务 实际业务当中有很多代码 这里只是模拟
}
string[] tasks = new string[1000];
Parallel.For(0, 1000, i =>
{
tasks[i] = i.ToString();
});
Parallel.ForEach(tasks, task =>
{
Console.WriteLine("正在执行{0}个任务", task);
Console.WriteLine("线程索引{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(new Random().Next(100));
});
如果要求顺序不乱的话,要用第三个long参数,据说反而会降低速度,没试过
//声明线程数组
string[] tasks = new string[1000];
private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
tasks[i] = i.ToString();//加载模拟的任务 实际业务当中有很多代码 这里只是模拟
}
ParallelOptions d = new ParallelOptions();
d.MaxDegreeOfParallelism = 24;
System.Threading.Tasks.Parallel.ForEach(tasks,d, (index) => { DoIt(index); });
}
int maxC = 0;
private void DoIt(string i)
{
Console.WriteLine("正在执行{0}个任务",i);
Console.WriteLine("索引{0}", maxC);
maxC++;
//Thread.Sleep(1); //随机阻塞一会儿
}
这样应该是我想要的,这样就是我想要的了,如果原生的办法 得写很多代码
private void DoIt()
{
while (true)
{
string task = null;
lock (tasks) // 锁里面尽量少做事情,保证不同线程拿到不同任务就可以了
{
if (index < tasks.Length)
{
task = tasks[index++];
//加一个方法
workCalute(task);//我要在这workCalute方法里干很多活 这样写可以吗?
}
}
if (task == null) //所有任务都完成了
{
timer.Stop();
Console.WriteLine(timer.Elapsed);//显示时间
Console.WriteLine(timer.ElapsedMilliseconds);
break;
}
else
{
var tid = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("正在执行{0}_线程id={1}", task, tid);
Thread.Sleep(50); //耗时的工作要放到锁外面
Console.WriteLine("{0}结束", task);
}
}
}
private void DoIt()
{
while (true)
{
string task = null;
lock (tasks) // 锁里面尽量少做事情,保证不同线程拿到不同任务就可以了
{
if (index < tasks.Length)
{
task = tasks[index++];
}
}
if (task == null) //所有任务都完成了
{
timer.Stop();
Console.WriteLine(timer.Elapsed);//显示时间
Console.WriteLine(timer.ElapsedMilliseconds);
break;
}
else
{
var tid = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("正在执行{0}_线程id={1}", task, tid);
Thread.Sleep(50); //耗时的工作要放到锁外面
Console.WriteLine("{0}结束", task);
}
}
}