[英]Tasks in C# are executing sequentially and not concurrently
出于纯粹的实验原因,我试图使用C#中的Task
编写一个伪随机数生成器
我有2个任务,以及2个静态变量glo_a
和glo_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.