我有一个要求,我需要在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}}主题
抱歉我的英语不好!!! :)
答案 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();
}
}