在For循环C中线程化#

时间:2014-08-06 06:56:34

标签: c# multithreading for-loop asynchronous

我有一个要求,我需要在ForLoop中同时处理两个Threads。

例如:

private void BtnThreading_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 20; i++)
    {
        Thread thread1 = new Thread(ProcessA);
        thread1.Start();

        thread1.Join();

        Thread thread2 = new Thread(ProcessB);
        thread2.Start();
     }
}

private void ProcessA()
{
    Thread.Sleep(10000);
}

private void ProcessB()
{
     Thread.Sleep(20000);
}

对于First Time中的for-loop,我们说ProcessA()需要10 Seconds完成,我需要等到ProcessA()完成使用thread1.Join();开始处理ProcessB()。稍后ProcessB()启动,需要20秒才能完成。

所以,平均而ProcessA()再次开始,thread1.Join();语句将等到ProcessA()结束。我还需要等待前一个ProcessB()完成。

最后,我希望ProcessB()等待Previous <{1}}主题

抱歉我的英语不好!!! :)

3 个答案:

答案 0 :(得分:2)

除非您真的需要进行低级编程,否则不应直接使用Thread个对象。每个线程在资源方面都非常昂贵。相反,.NET提供了几个高级抽象来进行异步和并行编程。您的循环可以使用async和await构建,然后在线程池线程上执行。这是一个例子:

您必须使用Thread.Sleep

,而不是使用Task.Delay来模拟延迟
async Task ProcessA() {
  await Task.Delay(10000);
}

async Task ProcessB() {
  await Task.Delay(20000);
}

循环:

var task = Task.Delay(0); // No operation task to simplify loop.
for (var i = 0; i < 20; i += 1) {
  await ProcessA();
  await task;
  task = ProcessB();
}
await task;

答案 1 :(得分:1)

看起来你根本不需要ProcessA在不同的线程中执行 - 但你需要跟踪你以前的ProcessB线程。如下所示:

Thread previousThread = null;
for (int i = 0; i < 20; i++)
{
    ProcessA();

    if (previousThread != null)
    {
        previousThread.Join();
    }

    previousThread = new Thread(ProcessB);
    previousThread.Start();
}
// Possibly join on previousThread here too

请注意,您的方法名称​​建议您在UI线程中执行此操作 - 您真的,实际上不应该这样做。不要在任何时间段内阻止UI线程 - 并且请记住Join 是阻止呼叫。

答案 2 :(得分:0)

您可以尝试使用此代码,但同样不是生产就绪.. !!!

    Thread thread1 = null;
    Thread thread2 = null;
    private void BtnThreading_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 20; i++)
        {
            thread1 = new Thread(ProcessA);
            thread1.Start();

            thread1.Join();

            if (thread2 != null)
                thread2.Join();
            thread2 = new Thread(ProcessB);
            thread2.Start();
        }
    }