C#中的任务是按顺序执行而不是同时执行

时间:2011-05-06 06:50:08

标签: c# .net multithreading task-parallel-library static-variables

出于纯粹的实验原因,我试图在C#中使用Task来编写一个伪随机数生成器

我有2个任务,2个静态变量glo_aglo_countglo_a应该保存最终结果(7位随机二进制整数)。

public static int glo_a = 0, glo_count = 6;

Private void button1_Click(object sender, RoutedEventArgs e)
{
  Task task = new Task(() => this.display(1));
  Task task2 = new Task(() => this.display(0));

  task.Start();
  task2.Start();

  Task.WaitAll();
  textBox1.AppendText("\n" + glo_a);
}

public void display(int j)
{
  for (; glo_count >= 0; glo_count--)
  {  
    glo_a += j * (int)Math.Pow(10,glo_count);
  }
}

private void refreshbutton_Click(object sender, RoutedEventArgs e)
{
  /* reset the original values*/  
  glo_a = 0;
  glo_count = 6;
  textBox1.Text = "";  
}

我遇到的问题是task先执行并在每次task2开始之前完成。

2 个答案:

答案 0 :(得分:3)

由于任务很少有可能,他们最终会一个接一个地运行,并且自从你首先启动task1后,这可能会先运行。

正如其他答案所说,只需使用Random类。

答案 1 :(得分:2)

我可以问你为什么不只是使用它来生成“位”:

Random r = new Random();
r.Next(2);

或更好:

Random r = new Random();
byte[] randomBytes = new byte[7];
r.NextBytes(randomBytes);

在任何情况下,假设你有一个奇怪的要求去做你正在做的事情,你确定它们是按顺序运行的吗?

我会说第一个任务有可能在第二个任务有机会开始之前结束。

无论如何,这都是一回事,但你可以试试:

Task.WaitAll(
    new Task( () => this.display(1) ),
    new Task( () => this.display(0) )
);

如果你急于使用你拥有的东西,你可以做一个随机生成来决定首先启动哪个任务:

Random r = new Random();

Task task = new Task(() => this.display(1));
Task task2 = new Task(() => this.display(0));
Task[] tasks = new [] { task, task2 };

/* Only supports 2 tasks */
int firstTask = r.Next(2); 

tasks[firstTask].Start();
tasks[firstTask ^ 1].Start();

Task.WaitAll();