gpt4 book ai didi

c# - 使用任务并行库时得到奇怪的结果?

转载 作者:行者123 更新时间:2023-11-30 22:19:43 26 4
gpt4 key购买 nike

我正在尝试使用 TPL 执行一些过滤任务。在这里,我简化了代码以根据条件过滤数字。这是代码。

public static void Main (string[] args)
{
IEnumerable<int> allData = getIntData ();

Console.WriteLine ("Complete Data display");
foreach (var item in allData) {
Console.Write(item);
Console.Write(" | ");
}

Console.WriteLine ();
filterAllDatas (ref allData, getConditions ());

foreach (var item in allData) {
Console.Write(item);
Console.Write(" | ");
}
Console.WriteLine ();
}

static void filterAllDatas(ref IEnumerable<int> data, IEnumerable<Func<int,bool>> conditions)
{
List<int> filteredData = data.ToList ();
List<Task> tasks = new List<Task>();
foreach (var item in data.AsParallel()) {
foreach (var condition in conditions.AsParallel()) {

tasks.Add(Task.Factory.StartNew(() => {
if (condition(item)) {
filteredData.Remove(item);
}
}));

}
}
Task.WaitAll(tasks.ToArray());
data = filteredData.AsEnumerable ();
}
static IEnumerable<Func<int,bool>> getConditions()
{
yield return (a) => { Console.WriteLine("modulo by 2"); return a % 2 == 0;};
yield return (a) => { Console.WriteLine("modulo by 3"); Thread.Sleep(3000); return a % 3 == 0;};

}
static IEnumerable<int> getIntData ()
{
for (int i = 0; i < 10; i++) {
yield return i;
}
}

这里是简单的代码,过滤掉除以二或三的整数。现在,如果我删除该线程休眠代码,它就可以正常工作,但如果我把它放在那里,它就不行了。

通常意味着没有 Thread.Sleep ,两个条件都执行 10 次,例如对于每个数字。但是如果我添加 Thread.Sleep 第一个条件执行 7 次,第二个条件执行 13 次。并且因为这几个数字跳过了条件。我尝试调试但没有得到任何可以指出我的代码问题的信息。

有什么好的方法可以实现吗?比如数据的过滤条件可以异步和并行工作以提高性能?

代码仅供演示。

仅供引用:目前我在 Windows 机器上将 Mono 与 Xamarine Studio 结合使用。

如果需要任何进一步的详细信息,请告诉我。

最佳答案

我猜这与您的任务的 lambda 如何关闭循环变量 condition 有关。尝试按如下方式更改它:

        foreach (var condition in conditions.AsParallel()) {
var tasksCondition = condition
tasks.Add(Task.Factory.StartNew(() => {
if (tasksCondition(item)) {
filteredData.Remove(item);
}
}));

请注意,您还关闭了循环变量 item,这可能会导致类似的问题。

关于c# - 使用任务并行库时得到奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15429500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com