2012-09-24 21 views
-2

我的情況是: 循環和線程正在並行工作..我想停止循環的執行直到線程完成其功能,當線程狀態停止,當時我想進一步執行循環..循環和線程正在並行工作

  for (int pp = 0; pp < LstIop.Count; pp++) 
      { 
       oCntrlImageDisplay = new CntrlImageDisplay(); 
       oCntrlImageEdit = new CntrlImageEdit(); 
       axAcroPDF1 = new AxAcroPDFLib.AxAcroPDF(); 
       int pages = ConvertFileIntoBinary(LstIop[pp].Input, oCntrlImageEdit); 
       oCntrlImageDisplay.ImgDisplay.Image = LstIop[pp].Output; 
       oCntrlImageDisplay.ImgEditor.Image = oCntrlImageDisplay.ImgDisplay.Image; 


       if (t1 == null || t1.ThreadState.ToString() == "Stopped") 
       { 
        t1 = new Thread(() => convert(pages, LstIop[pp].Input, LstIop[pp].Output, stIop[pp].Temp)); 
        t1.SetApartmentState(ApartmentState.STA); 
        t1.IsBackground = true; 
        CheckForIllegalCrossThreadCalls = false; 
        t1.Start(); 

       } 
      } 
+1

如果循環應該等待線程完成與循環中的工作有什麼不同? – Dialecticus

+0

那麼爲什麼要在一個單獨的線程中調用代碼?爲什麼不直接在循環中調用convert方法? – mbeckish

+0

如果下一個線程無法啓動,直到當前線程完成,那麼你的線程不能並行工作,你可能也不會打擾線程。更好的解決方案是創建一個循環,爲所有圖像啓動線程,然後等待它們全部完成後再繼續。 –

回答

-1

爲其他人所說,有在這裏線程沒有意義的,但如果你的地獄彎下腰,做異步。只是使用.Invoke或.begininvoke接着是.endInvoke

EX:使用委託

delegate void T2(); 

    static void Main(string[] args) 
    { 
     T2 Thread = new T2(Work); 

     while (true) 
     { 
      IAsyncResult result = Thread.BeginInvoke(null, null); 

      //OTHER WORK TO DO 

      Thread.EndInvoke(result); 
     } 
    } 

    static void Work() 
    { 
     //WORK TO DO 
    } 

是好的,因爲你可以指定返回數據,併發送參數

delegate double T2(byte[] array,string text, int num); 

    static void Main(string[] args) 
    { 
     T2 Thread = new T2(Work); 

     while (true) 
     { 
      IAsyncResult result = Thread.BeginInvoke(null, null); 

      //OTHER WORK TO DO 

      double Returned = Thread.EndInvoke(result); 
     } 
    } 

    static double Work(byte[] array, string text, int num) 
    { 
     // WORK TO DO 
     return(3.4); 
    } 
+0

這已經過時了。 OP不僅不希望這樣做,而且如果有人想使用任務來做到這一點,那將會更輕鬆,更強大。 – Servy

+0

正如我所說,這不太可能是他需要採取的方法,即使是這樣,它也不會很好地完成。哦,現在你幾乎不應該定義自己的代表,你可以使用'Func'和/或'Action'來覆蓋99%的用例。 – Servy

-2

等待線程執行完畢,請致電:

​​
+0

你最終會寫't1.Start(); t1.Join();',它只是使整個事情順序。沒有任何東西可以並行運行。 –