首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >任务清单没有给我期望的东西

任务清单没有给我期望的东西
EN

Stack Overflow用户
提问于 2018-05-01 22:31:57
回答 2查看 45关注 0票数 0

运行以下命令时,任务#{0}和cb的值为100。

如果我在循环中逐行调试,则得到正确的答案。

怎么解决这个问题?

代码语言:javascript
运行
复制
public static void TaskList()
{
    ConcurrentBag<int> cb = new ConcurrentBag<int>();
    List<Task> taskArray = new List<Task>();
    for (int i = 0; i < 100; i++)
    {
        taskArray.Add(Task.Factory.StartNew((Object obj) => {
            int j = 0 + i;
            cb.Add(j);
            Debug.WriteLine("Task #{0} created on {1}",
                                j, Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(10);
        },
                                                i));
    }
    Task.WaitAll(taskArray.ToArray());
    foreach(var v in cb)
    {
        Debug.WriteLine(v);
    }
    Debug.WriteLine("");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-01 22:54:56

您正在任务中传递一个修改的闭包(i)。

当有效执行Task时,不确定i的值(在您的情况下,它是100,因为任务在for循环完成后开始)。

您必须避免在延迟执行的委托中捕获修改过的闭包(您的Task片段就是一个例子,但使用LINQonIEnumerable也可能发生同样的情况)。

相反,将值赋值给局部变量,并将其传递到Task操作中:

代码语言:javascript
运行
复制
for (int i = 0; i < 100; i++)
{
    var count = i;
    taskArray.Add(Task.Factory.StartNew((Object obj) => {
        int j = 0 + count;
        cb.Add(j);
        Debug.WriteLine("Task #{0} created on {1}",
                            j, Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(10);
    },
                                            i));
}
票数 3
EN

Stack Overflow用户

发布于 2018-05-01 22:55:03

在几乎每次运行时,您都会看到100被打印出来,因为下面一行中的i在任务运行时相当于100:

代码语言:javascript
运行
复制
int j = 0 + i;

我相信您正在尝试用int j = 0 + i行来缓解这个问题,但是由于i是要更改的,所以j仍然等同于任务运行时的i。如果在任务之外将i的值分配给j,则不会看到这个问题:

代码语言:javascript
运行
复制
int j = i;

taskArray.Add(Task.Factory.StartNew((Object obj) => {
    cb.Add(j);
    Console.WriteLine("Task #{0} created on {1}",
                        j, Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(10);
}, , i));

我不确定我在解释这个问题上做得很好,但我希望这会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50124755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档