2012-09-05 147 views
0

我有一個帶有listview的表單,用戶也可以添加任務。然後用戶可以點擊一個按鈕,然後應用程序通過列表視圖1中的每個任務執行1。如何在這種情況下實現多線程?可能嗎?

這些任務更像是實際完成tasks.I由具有類中有一個循環,對每一個項目開始,然後完成我的每個項目(指令)設置任務執行此操作。爲了開始解析,我在調用該函數的表單上有一個按鈕。 IE:RunTask(listview1,1) - 基本上所有這些都會啓動我在課堂上的循環,並帶有指定的列表視圖和開始的項目。

一切都運行完美,除了在屏幕鎖定,所以無法實現停止功能,通過解析這些列表視圖項目停止應用程序。我只是不明白如何在沒有crossthreading的情況下實現這一點,因爲我想單獨運行的線程將始終訪問此列表視圖。重新設計程序以擺脫列表視圖是不可行的。我嘗試了application.doevents,儘管它也導致了人的錯誤。我一直在研究如何解決這個問題,但我不知道。希望有人能聽到一些光。

我也已經加入了後臺工作,以解決這一問題,但我必須明明設置checkforillegalcrossthreadcalls =假,我知道這是不聰明。

+2

從視圖分開的數據。沒有理由說你需要一個ListView來存儲數據,它並沒有被設計成一個集合對象。 –

+0

唯一的一點是,我也將信息存儲在listview項目標籤中。此外,我已經設置好了,所以我可以暫停它,通過這樣做,當點擊暫停按鈕時,它選擇當前項目。然後當再次擊中播放按鈕時,它檢查是否選擇了項目,並且如果它是從該項目開始。它還有一些直接使用listview的其他功能,我認爲使用標準列表是不可能的。感謝您的輸入。 – user1632018

回答

0

嘗試做這樣的事情。把你的列表視圖變成一組與UI不相關的值。就像這樣:

 string[] values = 
      this 
       .listView1 
       .Items 
       .Cast<ListViewItem>() 
       .Select(x => x.Text) 
       .ToArray(); 

然後你可以使用並行任務庫在後臺運行的任務:

 var tokenSource = new System.Threading.CancellationTokenSource(); 
     var token = tokenSource.Token; 

     var task = System.Threading.Tasks.Task.Factory 
       .StartNew(() => RunTasks(values, 1), token); 

如果您需要取消任務,你可以這樣做:

 tokenSource.Cancel(); 

但是在任務完成時處理UI更新,請執行以下操作:

 task.ContinueWith(r => 
     { 
      /* When compete code */ 
     }); 

確保您調用了UI更新,以便它們進入UI線程。

我道歉,我沒有在VB.NET寫這篇文章。我的VB正在生鏽。

+0

那麼這基本上把我的列表視圖變成一個列表?如果是這樣,那麼我在上面添加了關於我使用listview的評論,在這種情況下我會做什麼。我非常感謝你的幫助。我不知道c#,但我確定我可以使用轉換器輕鬆轉換它。 – user1632018

+0

那麼這就是訣竅。創建一個名爲'ListViewData'的新類。將引用更改爲您的列表視圖(僅在您的任務處理代碼中)爲這個新類的實例。你現在會得到錯誤一個接一個地將錯誤的child-classes/methods/properties添加到ListViewData類中,直到錯誤消失。您現在已將UI ListView類分離爲非UI ListViewData類。一段時間後,這種重構應該會變得很容易。祝你好運。 – Enigmativity

+0

對不起,延遲迴復。謝謝,儘管這是我所做的。 – user1632018

相關問題