Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用多线程实现这一点?_C#_Multithreading - Fatal编程技术网

C# 如何使用多线程实现这一点?

C# 如何使用多线程实现这一点?,c#,multithreading,C#,Multithreading,因此,我将阅读用户信息的数组列表,并使用它执行一些任务 e、 g for(int i=0;i { Thread.CurrentThread.IsBackground=true; …这里有些任务需要4-5分钟 }).Start(); } arraylist数据如下所示: 用户,信息,信息 用户2,信息,信息 用户3,信息,信息 用户,信息,信息 正如您在第4行中看到的,第1个用户再次重复 现在我想要的是某种方法来检测是否已经有线程在为用户运行。就像有2个线程为用户运行一样(第1行和第4行)。这不

因此,我将阅读用户信息的数组列表,并使用它执行一些任务

e、 g

for(int i=0;i
{
Thread.CurrentThread.IsBackground=true;
…这里有些任务需要4-5分钟
}).Start();
}
arraylist数据如下所示:

用户,信息,信息

用户2,信息,信息

用户3,信息,信息

用户,信息,信息

正如您在第4行中看到的,第1个用户再次重复

现在我想要的是某种方法来检测是否已经有线程在为用户运行。就像有2个线程为用户运行一样(第1行和第4行)。这不应该发生

我想做的是创建一个包含当前线程正在运行的所有用户的arraylist,并在每次创建新线程时检查该arraylist。如果是,请等待该线程完成,然后启动该线程

        ArrayList al = new ArrayList();
        foreach (var item in al)
        {
            **var obj = item;**
            new Thread(() =>
                       {
                           Thread.CurrentThread.IsBackground = true;

                           //...some task over here which would take 4 - 5 minutes

                       }).Start(**obj**);
        }

但是有更好的方法吗?

在循环中,只需将该项复制到一个新变量(以解决闭包问题)并将其传递给线程即可

Parallel.ForEach(lines.GroupBy(line => line.TheUser), grp => {
    // processing user grp.Key
    foreach(var line in grp) {
        // do the stuff here
    }
});
        ArrayList al = new ArrayList();
        foreach (var item in al)
        {
            **var obj = item;**
            new Thread(() =>
                       {
                           Thread.CurrentThread.IsBackground = true;

                           //...some task over here which would take 4 - 5 minutes

                       }).Start(**obj**);
        }

是否为第一个
用户
包含重复项?@Dennis不是重复项,而是要处理关于第一个用户的一些其他信息。问题不在于闭包,而在于包含同一用户项的数组,OP希望检查该用户是否已经存在运行线程。但我如何单独访问这些组?比如,我如何将组1运行到一个线程中,将组2运行到另一个线程中,将组3运行到另一个线程中…@SidharthJain这正是并行的
ForEach
所做的,但要明智(例如,不要打开一个愚蠢的线程数)@SidharthJain请告诉我你到底反对什么?你问我如何让它们进入线程,我解释说这就是
Parallel.ForEach
所做的。不多不少。你太过分了。如果你认为我在攻击你,那完全是你的想象。