出于纯粹的实验原因,我试图在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
开始之前完成。
答案 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();