c# - 列表的函数错误: '属性或索引器不能作为 out 或 ref 参数传递'
问题描述
我试图设置一个动态代码来检查系统中有多少个内核。我想我已经正确设置了它,我为每个核心启动一个任务,然后等待所有任务完成。
现在可以看出,每个任务将返回“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");
}
}
解决方案
我试图做一个使用数组的方法。有人可以确认这是一种有效的方法,或者如果我错过了什么或某事可以以更快的方式完成。
例如,如果这是最快的方式,或者这是一个瓶颈,因为速度很重要。我只能想到 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();
}
推荐阅读
- javascript - Javascript调用方法没有相同的上下文
- azure-data-factory - 使用源为 REST 服务的复制数据活动时触发重试的原因
- php - 使用 php preg_replace 替换整个字符串,如果字符串是较长字符串的一部分,则不替换
- ruby - CSV 如何根据用户选择删除行
- matlab - 有没有一种方法可以使用 Matlab 中的 if/else 语句自动将文件从不同位置移动?
- ios - 在 Swift 5 中获取当前用户的 Firebase 文档
- ruby - 为什么#map 比#each 更有效?
- batch-file - 搞乱批处理
- c++ - 比较两个字符串后陷入无限循环
- javascript - 在页面刷新或关闭浏览器时保持输入类型文件内容