2013-09-24 102 views
0

我是新來multithreading.I一派以下一些基本的例子是代碼爲什麼這個簡單的多線程不working.UI變得反應遲鈍

Imports System.Threading 
Public Class Form1 
Dim t As New Thread(AddressOf Me.BackgroundProcess) 
Private Sub btnStartThread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartThread.Click 
    t.Start() 
End Sub 

Private Sub StopButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopButton.Click 
    t.Abort() 
End Sub 

Public Sub BackgroundProcess() 
    Dim i As Integer = 1 

    If Me.InvokeRequired Then 
     Me.Invoke(New MethodInvoker(AddressOf BackgroundProcess)) 
    Else 
     Do While True 
      Me.ListBox1.Items.Add("Iteration:" & i) 
      i += 1 
     Loop 
    End If 
End Sub 
End Class 

當我點擊開始擰我的UI變得unresponsive.What會背後this.Below原因是UI截圖 Form1

+0

要點是什麼這段代碼?這不是一個很好的線程使用。你所有的代碼都在UI上運行。 – dbasnett

+0

@dbasnett我正在學習multithreading.This只是一個基本的use.If您有任何其他的鏈接,請分享..謝謝 – Sachin

回答

1

您在「後臺」線程檢查代碼,看它是否是在UI線程上

If Me.InvokeRequired Then 

如果不是,它會通知它在UI線程上運行。

Me.Invoke(New MethodInvoker(AddressOf BackgroundProcess)) 

如果它在UI線程上,它將在一個循環中阻塞UI線程,而不會泵送。

Do While True 

爲了得到這個工作,的很多方法可以做到這就像這一個:

Public Delegate Sub AddItemDelegate(ByVal item As Object) 
Public Sub BackgroundProcess() 
    Dim i As Integer = 1 

    Do While True 
     i += 1 
     If Me.InvokeRequired Then 
      Me.Invoke(New AddItemDelegate(AddressOf AddItem), "Iteration:" & i) 
     Else 
      AddItem("Iteration:" & i) 
     End If 
    Loop 
End Sub 
Private Sub AddItem(ByVal item As Object) 
    Me.ListBox1.Items.Add(item) 
End Sub 

使用委託是首選的方式。

+0

,同意但我應該怎麼做才能使UI響應 – Sachin

+0

編輯:添加了正確的代碼。 – Steve

+0

@ Steve.Delegates事情工作..感謝夥計! – Sachin

0

你基本上正在用大量的更新來處理UI線程,所以它從來沒有機會響應用戶輸入。改變循環睡眠一小段時間。

Do While True 
     Me.ListBox1.Items.Add("Iteration:" & i) 
     i += 1 
     Thread.Sleep(100) 
    Loop 
+0

我在CurrentThread附近收到警告:'通過實例訪問共享成員,常量成員,枚舉成員或嵌套類型;符合條件的表達不會被評估。'什麼原因 – Sachin

+0

對不起,我只是把它作爲需要做的一個例子;您需要找到一種方法來停止使用循環中的整個UI線程。我編輯了答案,看看是否有效。 –

+0

k.this警告是因爲某些setting.I改變了這些設置,它的工作.Ref鏈接是[鏈接] http://social.msdn.microsoft.com/Forums/vstudio/en-US/2860692b-eea6-4fe1 -99ef-c53cc6a7f906/access-of-shared-member-constant-member-enum-member-or-nested-type-through-an-an-qualifying – Sachin

0

當運行代碼的用戶界面是反應遲鈍,因爲UI是接收更新的大量的時間非常短的空間,無論是從被無限循環停止:

 Do While True 
      Me.ListBox1.Items.Add("Iteration:" & i) 
      If i > 10 Then 
       Exit Do 
      End If 
      i += 1 
     Loop 

或加一個等待計時器每圈快後慢的用戶界面的更新頻率:

 Do While True 
      Me.ListBox1.Items.Add("Iteration:" & i) 
      i += 1 
      'Sleep for 1 second 
      Thread.CurrentThread.Sleep(1000) 
     Loop 

你也應該停止代碼在UI線程上運行,你正在創建一個線程來了在UI線程上運行一些東西,這對我來說似乎不需要。

即改變

Me.InvokeRequired 

ListBox1.InvokeRequired 

而且

Me.Invoke(New MethodInvoker(AddressOf BackgroundProcess)) 

ListBox1.Invoke(New MethodInvoker(AddressOf BackgroundProcess)) 
+0

感謝您的feedback.But仍然我的用戶界面仍然沒有響應。停止按鈕不接受任何commands.I要停止此線程使用停止按鈕(t.abort)。我可以通過使用t.abort( )方法 – Sachin

+0

您可以嘗試創建一個用作True語句的類變量,並在單擊中止按鈕時將其設置爲false。但是,如果循環仍然無限且沒有睡眠語句,它仍然會導致UI凍結,並且無法單擊中止按鈕。 – Nunners

相關問題