被调用函数内部的参数值不同

我正在使用下面的代码在C#中创建多个任务。

private static List<Task> _taskList = new List<Task>();
private static ConcurrentQueue<string> cred = new ConcurrentQueue<string>();

private static void TaskMethod1(string usercred)
{
    // I am doing a bunch of operations here, all of them can be replaced with
    // a sleep for 25 minutes.
    // After all operations are done, enqueue again.
    cred.Enqueue("usercred")
}

private static void TaskMethod()
{
    while(runningService)
    {
        string usercred;
        // This will create more than one task in parallel to run,
        // and each task can take up to 30 minutes to finish.
        while(cred.TryDequeue(out usercred))
        {
            _taskList.Add(Task.Run(() => TaskMethod1(usercred)));
        }
    }
}

internal static void Start()
{
    runningService = true;
    cred.enqueue("user1");
    cred.enqueue("user2");
    cred.enqueue("user3");
    Task1 = Task.Run(() => TaskMethod());
}

我在上面的代码中遇到了一个奇怪的行为。通过将断点放在 _taskList.Add(Task.Run(() => TaskMethod1(usercred)));,我正在检查 usercred 每次 TaskMethod1 调用,并且在调用时不为空,但在其中一种情况下,调用 usercrednull 里面 TaskMethod1. 我不知道怎么会发生这种情况。

解决方案:

你使用的是 Task.Run 其中你使用的是while循环的变量。你没有把它传递给任务。所以,当任务执行时,它的值会被改变。

你应该使用

while (runningService)
{
    string usercred;
    // This will create more than one task in parallel to run,
    // and each task can take upto 30 minutes to finish.
    while (cred.TryDequeue(out usercred))
    {
        _taskList.Add(Task.Factory.StartNew((data) => TaskMethod1(data.ToString()), usercred)
    }
}

本文来自投稿,不代表实战宝典立场,如若转载,请注明出处:https://www.shizhanbaodian.com/6722.html

(0)
上一篇 2022年6月5日 下午6:39
下一篇 2022年6月5日 下午7:36

相关推荐

发表评论

登录后才能评论