如何将一个for循环划分为多个循环并使用线程运行它们以缩短运行时间?

Nas*_*ghi 2 c# multithreading loops visual-studio-2015

我是C#多线程的新手.我已经定义了一个简单的for循环,当我按下一个按钮时,它从0开始计数到10000并使用秒表我捕获了完成这个循环所需的时间.

private void button2_Click(object sender, EventArgs e)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        for (double i = 0; i < 5000; i++)
        {
            Console.WriteLine(i.ToString() + ", ");

        }
        sw.Stop();
        TimeSpan ts = sw.Elapsed;
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
        MessageBox.Show(elapsedTime);
    }
Run Code Online (Sandbox Code Playgroud)

在我的笔记本电脑上需要:15':28''

另一方面,我尝试多线程以了解我是否可以缩短这个时间.我做的是:

1)定义5个函数(Func1,Func2,....,Func5)

2)在每个函数内部,我定义了一个for循环,它计算main for循环的五分之一:

Func1:0 - 1000

Func2:1000 - 2000

Func3:2000 - 3000

Func4:3000 - 4000

Func5:4000 - 4000

3)最后,我定义了五个不同的线程,并在每个线程中调用每个函数.

从逻辑上讲,我希望在更短的时间内得到结果,但运行时间与没有线程的时间相同.

private void button1_Click(object sender, EventArgs e)
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();

        Thread T1 = new Thread(new ThreadStart(Func1));
        T1.Start();

        Thread T2 = new Thread(new ThreadStart(Func2));
        T2.Start();

        Thread T3 = new Thread(new ThreadStart(Func3));
        T3.Start();

        Thread T4 = new Thread(new ThreadStart(Func4));
        T4.Start();

        Thread T5 = new Thread(new ThreadStart(Func5));
        T5.Start();

        T1.Join();
        T2.Join();
        T3.Join();
        T4.Join();
        T5.Join();
        sw.Stop();
        TimeSpan ts = sw.Elapsed;
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
        MessageBox.Show(elapsedTime);
    }
Run Code Online (Sandbox Code Playgroud)

我可以使用线程缩短运行时间吗?如果有,怎么样?如果不是,我应该使用什么方法?

我测试了这段代码以查看C#线程的功能,它可能看起来没用,但我会在图像处理应用程序中使用它来缩短几个for循环的运行时间.

请帮忙.

InB*_*een 7

你有一个餐厅.你只有一个厨师做得很好,但他的速度很慢.你有一个服务员接受所有订单并将其交给厨师.这太慢了,客户开始抱怨.

你有一个好主意(或不是).你雇佣了100名服务员,这应该会让事情变得更快!好吧,现在你已经获得了更快地送到厨师的订单,但是食物仍以同样的速度出现.怎么可能?

改变烹调的Console.WriteLine和服务员的Threads并且那基本上就是你正在尝试做的.你看它是多么无意义?

现在,如果你有10个厨师(加工商)和只有一个服务员(线程),那么完全不同的故事就是这样.在这种情况下,雇用9名服务员将非常有意义.

故事的道德启示?当您要执行处理器绑定任务时,使用更多线程并并行化,并且您有处理器闲置等待.否则,通常有更好的方法来处理无用的线程.

  • @ Naser.Sadeghi你错过了这一点.您的笔记本电脑可以拥有100个处理器,如果手头的任务不受处理器限制(处理器不是瓶颈),那么使用更多线程将毫无用处.我不知道你要解决什么任务,所以我无法告诉你如何有效地解决它. (2认同)
  • @ Naser.Sadeghi`Console.WriteLine`不受处理器限制.控制台的订单和订单比处理器可以实现的要慢.它受到处理它收到的消息的速度有限,它只有一个消息队列.如果您将消息更快地放在队列中,它将只会变得更长,而不是更快. (2认同)