【问题标题】:Tasks in C# are executing sequentially and not concurrentlyC# 中的任务是按顺序执行而不是同时执行
【发布时间】:2011-08-19 22:49:27
【问题描述】:

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

我有 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 每次开始之前完成。

【问题讨论】:

  • 要做的任务很少,这不足为奇。

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


【解决方案1】:

我能问一下为什么你不只是使用这个来生成“位”吗:

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

【讨论】:

  • 这只是一个学习的东西。基本上,目的不是生成随机编号。我想了解 TPL 的功能。但是由于共享静态变量(我猜),TPL 将任务安排为顺序执行。有没有办法同时执行它们? p.s.(我有一个 i5 处理器,所以单处理不是问题;))
  • 我会说这不是顺序执行,这是第一个任务太小并且处理速度太快的事实,或者至少总是在第二个任务之前。仅仅因为它们是异步的(即同时运行)并不意味着它们必然以不确定的顺序开始。如果我们俩同时跑在同一条赛道上,但你先开始,即使我们同时跑,每次你都可以先结束。我已经更新了如何切换首先启动的任务,但显然这违背了目的。
  • 嗯...谢谢。但正如我所说,我的目标不是随机 num 生成...我想了解 tpl 是如何工作的...但我认为你是对的,我的第一个任务在第二个开始之前结束...我认为 sleep 会解决它:)
  • 再次感谢...我想我该做什么了...任务太短了...我解决了
【解决方案2】:

由于任务很少有可做的机会,它们最终会一个接一个地运行,并且由于您首先启动了 task1,因此很可能会先运行。

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

【讨论】:

    最近更新 更多