我想要做的事情非常簡單,
我掃描了一個字符串列表,然後將每個字符串傳遞給一個新線程進行打印。將每個列表項目逐一傳遞給新線程
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
等
事實上,如果我在每個線程創建後放一個延遲,我會得到我期望得到什麼。
有什麼想法?
我曾嘗試你的代碼(vs2012 C#控制檯應用程序默認設置,win8.0 64) - 我從來沒有重複的數字。 - 我確實按照您所期望的使用多線程的方式將它們亂序排列,但不能重複。 –
難道你不想讓你的ThreadJob方法成爲一個實例方法嗎?它似乎不是線程安全的 –
這是因爲循環變量。 [關閉循環變量被認爲是有害的](http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx)。更改爲for循環或使用本地foreach變量,如oakio所示。 – Patrick