繁体   English   中英

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

[英]Tasks in C# are executing sequentially and not concurrently

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

我有2个任务,以及2个静态变量glo_aglo_count glo_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开始每一次。

由于这些任务几乎没有机会进行,因此它们最终会一个接一个地运行,并且由于您是首先启动task1的,因此很有可能先运行。

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

我能问一下为什么您不仅仅使用这个生成“位”吗?

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM