我试图设置一个动态代码,该代码检查系统中有多少核。我认为我在为每个核心启动任务的地方正确设置了它,然后等待所有任务完成。
现在所见,每个任务都将返回" list1 [i]"one_answers" 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");
}
}
我试图使用数组进行方法。有人可以确认这是一种有效的方法,还是我想念某件事或可以更快地完成某件事。
例如,如果这是最快的方法,或者这是瓶颈,因为速度很重要。我只能想到做.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();
}