所以我花了整個週末閱讀和研究.net中的多線程,並且有一個問題我不明白。多線程範圍
說我有一個按鈕,當我點擊這個按鈕時,我想上傳一個文件到Amazon S3,現在顯然這個上傳任務將需要幾秒鐘的時間,而我不想在這樣做時停止其他任何操作。所以這是線程進入的地方。
所以然後出現問題,如果用戶再次單擊該按鈕,我不想啓動另一個線程上傳文件,除非第一個線程已完成,嘗試以避免冗餘。
無處不在我關於多線程描述中描述了當我需要時聲明線程,但是如果我在按鈕上執行該操作,肯定會在第二次單擊按鈕時創建與線程名稱的某種衝突已經有一個同名的線程。
所以我的解決方案是在課程開始時聲明線程。用代碼創建一個子文件來上傳文件。然後單擊該按鈕時,請在運行之前檢查線程是否處於活動狀態。 但後來我發現我不能讓一個線程一旦完成就重新開始。
所以我不能理解的是我如何設計一個任務需要多次執行在一個單獨的線程中運行。我希望每次我想要運行時創建一個新線程?這是否意味着我需要創建一個具有唯一名稱的新線程?線程完成後會發生什麼?我已經讀過,中止一個線程非常糟糕,但我是否期望永遠不會無所作爲並且無法刪除它?這是否意味着如果應用程序運行了很長一段時間,那麼我可以用數以千計的「死」線程來解決問題?
這是我在做的事情的標記版本,以防萬一,讓事情變得更容易。
Public Class Form1
Shared UploadThread As Thread = New Thread(AddressOf UploadLoop)
Shared Sub UploadLoop()
'code to upload a file to amazon S3
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If (UploadThread.IsAlive) Then
MsgBox("upload not completed")
Else
UploadThread.Start()
End If
End Sub
End Class
只需將按鈕的Enabled屬性設置爲* False *。傳輸完成後再次啓用它,您更喜歡BackgroundWorker提供的RunWorkerCompleted事件。十分簡單。 –