using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace MultiThreading_Example
{
class theMeter {
int count1 = 0;
public void CounterMeter()
{
while (this.count1 < 10000)
{
this.count1++;
Console.WriteLine(this.count1);
}
}
}
class Program
{
static void Main(string[] args)
{
theMeter met = new theMeter();
ThreadStart countForMe = new ThreadStart(met.CounterMeter);
for (int i = 0; i < 1000; i++)
{
Thread t1 = new Thread(countForMe);
t1.Start();
t1.Join();
t1.Abort();
}
Console.ReadLine();
}
}
}
知道这有什么问题吗?我的意思是,我尝试过没有t1.Join()并尝试在一个线程上进行。一切都在同一速度。我怎样才能让程序更快地处理?
提前致谢!
答案 0 :(得分:0)
以下是工作示例示例。区别在于每个线程都存储在列表中并且并行启动,然后最后我们等待每个线程。
class theMeter
{
private int count1 = 0;
public void CounterMeter()
{
while (this.count1 < 10000)
{
this.count1++;
Console.WriteLine(this.count1);
}
}
}
class Program
{
static void Main(string[] args)
{
theMeter met = new theMeter();
ThreadStart countForMe = new ThreadStart(met.CounterMeter);
List<Thread> threads = new List<Thread>();
for (int i = 0; i < 10; i++)
{
Thread t1 = new Thread(countForMe);
t1.Start();
threads.Add(t1);
}
// here we will wait for completion of every thread that was created and added to list
threads.ForEach(t => t.Join());
Console.ReadLine();
}
}
此代码有几个值得一提的问题:
theMeter
实例,因此每个线程都将迭代相同的this.count1
变量,因此 它不是那么线程安全 即可。 IMO,更好的方法是为每个线程创建自己的实例,并为每个线程划分工作。因此,他们不会分享相同的资源,也不会导致共享资源访问问题。Join
将等待无限的时间。如果您的线程可能需要花费大量时间(网络,数据库等),那么您可以使用Join
超时,然后调用Abort
。但是仍然不建议使用Abort
方法,因为线程应该以优雅的方式完成他的逻辑,而不是Abort
方法的残酷中断。Parallel.ForEach
或Task
类,这可以使事情变得更容易一些。 实际Parallel.ForEach
的示例如下:
class Program
{
static void Main(string[] args)
{
theMeter met = new theMeter();
Enumerable.Range(0, 1000).AsParallel().ForAll((i) => met.CounterMeter());
Console.ReadLine();
}
}
但是你在这里没有那么多的灵活性,但它更容易