今天遇到类似于这样子一种情况
public class Program
{
public IList<int> list = new List<int>();
public void Method()
{
for (int i = 0; i < 1000; i++)
{
list.Add(i);
}
} public void dosomething()
{
for (int i = 0; i < 1000; i++)
{
Thread thread = new Thread(Method);
thread.Start();
}
}
static void Main(string[] args)
{
Program p= new Program();
p.dosomething();
Console.WriteLine(p.list.Count);
Console.Read();
}
}
dosomething里面启动了1000个线程,在每个线程里面对list添加0-1000,然后,,每次Console.WriteLine(p.list.Count);
打印的值不一样。。
我想做的是只有当这1000个线程都执行完了,再执行Console.WriteLine(p.list.Count);
只要有一个线程没有执行完, Console.WriteLine(p.list.Count)就执行挂起。。
public class Program
{
public IList<int> list = new List<int>();
public void Method()
{
for (int i = 0; i < 1000; i++)
{
list.Add(i);
}
} public void dosomething()
{
for (int i = 0; i < 1000; i++)
{
Thread thread = new Thread(Method);
thread.Start();
}
}
static void Main(string[] args)
{
Program p= new Program();
p.dosomething();
Console.WriteLine(p.list.Count);
Console.Read();
}
}
dosomething里面启动了1000个线程,在每个线程里面对list添加0-1000,然后,,每次Console.WriteLine(p.list.Count);
打印的值不一样。。
我想做的是只有当这1000个线程都执行完了,再执行Console.WriteLine(p.list.Count);
只要有一个线程没有执行完, Console.WriteLine(p.list.Count)就执行挂起。。
int doneTasks = 0; //<--
public void Method()
{
//...
Interlocked.Increment(ref doneTasks); //<--
}
static void Main(string[] args)
{
//...
while (p.doneTasks < 1000) Thread.Sleep(500); //<--
Console.WriteLine(p.list.Count);
Console.Read();
}
{
static void Main(string[] args)
{
for (int i = 0; i < 1000; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(TestMethod),i);
} manu.WaitOne();
Console.WriteLine("finish"); } static int methodNumber = 1000;
static ManualResetEvent manu = new ManualResetEvent(false); static void TestMethod(object state)
{
try
{
Console.WriteLine(state);
}
finally
{
if (Interlocked.Decrement(ref methodNumber) == 0)
manu.Set();
}
}
}
{
list.Add(i);
}
楼主这样添加数据有问题,没有同步,最后估计没有1000*1000数吧