【发布时间】:2019-05-17 22:06:59
【问题描述】:
在使用 Task.Run 对同一函数进行数千次迭代时,跟踪某个值增加了多少次时的最终结果导致总迭代次数与该值增加了多少次不匹配.为什么?怎么修?建议的替代方法?我的目标只是尽可能快地在多线程环境中运行相同的功能。
下面的代码示例显示了我现在正在尝试的内容,您应该能够按原样运行它以看到与我看到的相似的结果:
taskNumber = 9980, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 9998, nonTaskIterations = 10000
taskNumber = 9998, nonTaskIterations = 10000
taskNumber = 9999, nonTaskIterations = 10000
taskNumber = 9997, nonTaskIterations = 10000
taskNumber = 9999, nonTaskIterations = 10000
taskNumber = 9997, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 9995, nonTaskIterations = 10000
taskNumber = 9994, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 9998, nonTaskIterations = 10000
taskNumber = 9999, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 9999, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
static void Main(string[] args)
{
for (int i = 0; i < 20; i++)
{
//iterate many times to see different outputs
PrimaryFunction();
}
Console.WriteLine("why the hell does TaskNumber not always == nonTaskIterations value?");
Console.ReadLine();
}
static void PrimaryFunction()
{
long taskNumber = 0;
int nonTaskIterations = 0;
for (int i = 0; i < 100; i++)
{
List<Task> tasks = new List<Task>();
for (int j = 0; j < 100; j++)
{
nonTaskIterations++;
tasks.Add(Task.Run(() =>
{
taskNumber = taskNumber + 1;
DoWork(taskNumber);
}));
}
Task.WaitAll(tasks.ToArray());
}
Console.WriteLine("taskNumber = " + taskNumber + ", nonTaskIterations = " + nonTaskIterations);
}
static void DoWork(long i)
{
//do work here
Random random = new Random();
var x = random.Next(0, 10).ToString();
}
我希望每次运行时都能看到:
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
taskNumber = 10000, nonTaskIterations = 10000
我乐于接受有关如何修复此问题或替代方法的建议,这些方法也既快速高效又准确,可以反复运行多线程环境函数数千次而不会丢失任何增量值。
【问题讨论】:
标签: c# multithreading c#-4.0 task