将每个列表项一个接一个地传递到新线程 [英] Pass each list item to a new thread one by one

查看:78
本文介绍了将每个列表项一个接一个地传递到新线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想做的很简单,
我扫描了一个字符串列表,然后将每个字符串传递给新线程进行打印.

using System;
using System.Collections.Generic;
using System.Threading;

namespace MultithreadingSynchronization
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> stringList = new List<string> { "server1", "server2", "server3", "server4", "server5", "server6", "server7", "server8", "server9"};

            foreach (string server in stringList)
            {
                ThreadStart work = delegate { Threadjob(server); };
                new Thread(work).Start();
                //Thread.Sleep(10); // 10 ms delay of main thread
            }
        }

        public static void Threadjob(object server)
        {
            Console.WriteLine(server);
        }
    }
}

由于某种原因,有些线程接收到错误的值,因此,输出显示一些重复的字符串,并且还会丢失某些字符串.
我期望获得此输出(顺序并不重要):

server1
server2
server3
server4
server5
server6
server7
server8
server9

但是,有时候我会得到这个:

server3
server2
server5
server5
server7
server4
server8
server9
server9

有时候我会得到这个:

server2
server2
server4
server3
server6
server7
server7
server8
server9

的确,如果我在创建每个线程之后都延迟了时间,那么我会得到期望的结果.

有什么主意吗?

解决方案

您应制作变量的本地副本. 试试这个:

    foreach (string server in stringList)
    {
        string local = server;
        ThreadStart work = delegate { Threadjob(local); };
        new Thread(work).Start();
        //Thread.Sleep(10); // 10 ms delay of main thread
    }

此处有更多信息:在C#循环中捕获的变量

What I'm trying to do is very simple,
I scan a list of strings, then, I pass each string to a new thread for printing.

using System;
using System.Collections.Generic;
using System.Threading;

namespace MultithreadingSynchronization
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> stringList = new List<string> { "server1", "server2", "server3", "server4", "server5", "server6", "server7", "server8", "server9"};

            foreach (string server in stringList)
            {
                ThreadStart work = delegate { Threadjob(server); };
                new Thread(work).Start();
                //Thread.Sleep(10); // 10 ms delay of main thread
            }
        }

        public static void Threadjob(object server)
        {
            Console.WriteLine(server);
        }
    }
}

From some reason, there are threads that received wrong value, therefore, the output presents some duplicated strings, and also miss some strings.
I'm expecting for this output (the order isn't important):

server1
server2
server3
server4
server5
server6
server7
server8
server9

But, sometimes I get this:

server3
server2
server5
server5
server7
server4
server8
server9
server9

and sometimes I get this:

server2
server2
server4
server3
server6
server7
server7
server8
server9

etc.

indeed, if I put a delay after each thread creating, I get what I expect to get.

Any idea?

解决方案

You should make local copy of variable. Try this:

    foreach (string server in stringList)
    {
        string local = server;
        ThreadStart work = delegate { Threadjob(local); };
        new Thread(work).Start();
        //Thread.Sleep(10); // 10 ms delay of main thread
    }

More info here: Captured variable in a loop in C#

这篇关于将每个列表项一个接一个地传递到新线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆