在這個例子中,如果我想限制可以執行函數DoWork
的線程數一次爲10,那麼這是否正確使用了Parallel.For
循環?其他線程是否會被阻塞,直到十個線程中的一個變爲可用?如果不是,什麼是更好的多線程解決方案,仍然可以讓我執行6000+次以上的功能?在C#中正確使用Parallel for循環?
class Program
{
static void Main(string[] args)
{
ThreadExample ex = new ThreadExample();
}
}
public class ThreadExample
{
int limit = 6411;
public ThreadExample()
{
Console.WriteLine("Starting threads...");
int temp = 0;
Parallel.For(temp, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
{
DoWork(temp);
temp++;
});
}
public void DoWork(int info)
{
//Thread.Sleep(50); //doing some work here.
int num = info * 5;
Console.WriteLine("Thread: {0} Result: {1}", info.ToString(), num.ToString());
}
}
'temp ++'不是線程安全的。 – SLaks
@SLaks是的,它不是線程安全的,但在本次比賽中有意義嗎?如何工作Parallel.For? –
@HamletHakobyan你是什麼意思?程序員的意圖是清楚的;他想要統計已完成任務的數量。實際發生的事情並不是一回事,因爲競爭條件可能會導致計數器無法正確遞增。使用'interlocked.Exchange'就可以解決這個問題。至於'Paralle.For',它是一個'for'循環,迭代被多個線程並行執行(在一定程度上)。 – Servy