2011-02-10 88 views
1

好的,我確定有一個簡單的解釋,並且我缺乏正確的線程教育使我無法看到它,所以請裸露在我身邊......與Task.Factory同時運行多個線程無法正常工作

我的應用程序處理數據饋送。當一個新的數據包進來時,一個調度員收集它,並引發一個事件,一個適當的監聽者可以拿起並做它需要做的事情。

因此,現在我試圖模擬活飼料執行一些測試。我根據活動列表的數量創建了一個向分發器提供數據包的類。

這是我使用啓動它位於存儲器中的feed()方法和生成的分組在每個給定的時間間隔的代碼:

foreach (var item in Listeners) 
      { 
       object listener = item; 

       Task.Factory.StartNew(()=> Feed(listener), TaskCreationOptions.LongRunning); 

      } 

進料()方法的工作是這樣的:

while(run) 
{ 
packet = GenerateThePacket(listener.Id); // Make a packet with the listener id 
FeedHandler.OnPacketRecieved(this, packet); // Raises the FeedHandler's event as if it came from outside. 

Thread.Sleep(1000/interval) // interval determines how many packets per second 
} 

因此,如果我有100個監聽器,它將啓動100個Feed()實例,每個實例都有不同的監聽器ID,並且在請求的時間間隔內同時啓動PacketRecieved事件。

我猜你們很多人已經知道它有什麼不好,但我會解釋這個問題: 當我使用1或2的間隔時,它的效果很好。當我選擇10(即每100ms一個數據包)時,它不能正常工作。每個線程以不同的時間間隔啓動,其中最新創建的工作正常且快速(10 /秒),並且第一個線程創建工作實際上很慢(1 /秒或更少)。

基本上,我想100個線程不能同時運行,所以他們只是在等待......我想。

因此,究竟發生了什麼,以及如何實現一個真正的饋電發生器,它可以同時爲100個聽衆模擬10個數據包。

謝謝大家

+0

你正在使用哪種操作系統,並且你是否在這些方法中以任何方式涉及套接字? – 2011-02-10 13:51:08

+0

Windows 7與4GB的RAM,沒有插座 – 2011-02-10 13:56:45

回答

1

我認爲你是從錯誤的角度接近這個....

有通過這些閱讀:
http://blogs.msdn.com/b/pfxteam/archive/2010/04/21/9997559.aspx(鏈接到PDF在那裏) http://www.sadev.co.za/content/pulled-apart-part-vii-plinq-not-easy-first-assumed

簡而言之,任務庫將從線程池中獲得一個線程,如果一個線程池不可用,這些任務將被排隊,直到一個線程可用爲止.....因此,能夠併發運行的線程數量取決於你的系統和y的大小我們的線程池。

對我來說,有兩種方法可以...使用Parallel.ForEach靜態方法或使用PLinq AsParallel()選項,如上面的文章中所述。在一天結束的時候,到你要使用哪一個。

使用PLINQ ......是這樣的:

var parallelQuery = Listeners.AsParallel().Select(item=> Feed(item)); //creates the parallel query 
parallelQuery.ForAll(item=> <dosomething>);  //begin the parallel process and do whatever you need to do for each result. 

您的進紙方式/對象可以是這樣的:

while(run) 
    { 
    packet = GenerateThePacket(listener.Id); 
    FeedHandler.OnPacketRecieved(this, packet); // Raises the FeedHandler's event as if it came from outside. 

     //No more Thread.Sleep 
    } 

這是隻爲你但我的鏈接基本介紹上面添加的內容相當有幫助和內容豐富。這取決於你使用哪種方法。 請記住,您還可以添加其他選項....全部在上面的鏈接中。

希望這會有所幫助!