我试图建立一个动态代码,以检查系统中有多少个内核。我认为我已经正确设置了它,在这里我为每个核心启动一个任务,然后等待所有任务完成。
现在可以看到,每个任务都将返回“ list1 [i]”和“ list2 [i]”,如下所示:
out list1[i], out list2[i]
但是以上显示此错误:
“属性或索引器可能无法作为out或ref参数传递”
从我编写的其他代码中我已经意识到了这个问题,不可能返回到这样的索引。
在尝试编写动态代码时,要考虑到系统中有多少个内核。如果系统具有24个核心,怎么可能做我想做的事情而不是拥有例如24个硬编码列表?
private void button1_Click(object sender, EventArgs e)
{
new Thread(runthreads).Start();
}
void runthreads()
{
int nrCores = Environment.ProcessorCount;
List<List<String>> list1 = new List<List<String>>(); List<List<String>> completelist1 = new List<List<String>>();
List<List<String>> list2 = new List<List<String>>(); List<List<String>> completelist2 = new List<List<String>>();
Task[] tasks = new Task[nrCores];
for (int i = 0; i < nrCores; i++)
{
//Add lists
list1.Add(new List<String>());
list2.Add(new List<String>());
//Start Task
tasks[i] = Task.Factory.StartNew(() => onefunction(1, 2, out list1[i], out list2[i]));
}
Task.WaitAll(tasks); //Wait for all Tasks to complete
//Now add all lists to completelists
for (int i = 0; i < list1.Count; i++)
{
completelist1.AddRange(list1[i]);
completelist2.AddRange(list2[i]);
}
}
void onefunction(int num1, int num2, out List<String> list1, out List<String> list2)
{
//Example code for the function!
list1 = new List<String>(); list2 = new List<String>();
for (int i = 0; i < 1000000; i++)
{
list1.Add("1");
list2.Add("2");
}
}
答案 0 :(得分:0)
我试图用数组做一个方法。有人可以确认这是一种有效的方法吗?如果我错过了某件事,或者可以更快地完成某件事。
例如,如果这是最快的方法,或者这是瓶颈,因为速度很重要。我只能想到do .ToArray(),但想知道这样做是否“双重”工作,而不是通过直接添加到数组而不是从列表转换而做一些更干净的事情? (请注意,稍后我将不知道要添加到数组中的元素的数量)
array1 = list1.ToArray();
完整代码:
private void button1_Click(object sender, EventArgs e)
{
new Thread(runthreads).Start();
}
void runthreads()
{
int nrCores = Environment.ProcessorCount;
String[][] array1 = new String[nrCores][];
String[][] array2 = new String[nrCores][];
List<String> completelist1 = new List<String>();
List<String> completelist2 = new List<String>();
Task[] tasks = new Task[nrCores];
for (int i = 0; i < nrCores; i++)
{
//Start Task
tasks[i] = Task.Factory.StartNew(() => onefunction(1, 2, out array1[i], out array2[i]));
}
Task.WaitAll(tasks); //Wait for all Tasks to complete
//Now add all lists to completelists
for (int i = 0; i < array1.Length; i++)
{
completelist1.AddRange(array1[i]);
completelist2.AddRange(array2[i]);
}
}
void onefunction(int num1, int num2, out String[] array1, out String[] array2)
{
//Example code for the function!
List<String> list1 = new List<String>(); List<String> list2 = new List<String>();
for (int i = 0; i < 1000000; i++)
{
list1.Add("1");
list2.Add("2");
}
array1 = list1.ToArray();
array2 = list2.ToArray();
}