2017-10-15 61 views
0

所以我花了整個週末閱讀和研究.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 
+3

只需將按鈕的Enabled屬性設置爲* False *。傳輸完成後再次啓用它,您更喜歡BackgroundWorker提供的RunWorkerCompleted事件。十分簡單。 –

回答

0

已完成的線程處於「死」狀態。你不能輕易地用它做很多事情,你應該每次都要實例化一個新線程:

Shared UploadThread As Thread 

Private Sub Button1_Click(sender As Object, e As EventArgs) 
    If UploadThread IsNot Nothing AndAlso UploadThread.IsAlive Then 
     MsgBox("upload not completed") 
    Else 
     UploadThread = New Thread(New ThreadStart(AddressOf UploadLoop)) 
     UploadThread.Start() 
    End If 
End Sub 
+0

謝謝鮑勃,所以我可以繼續使用相同的名稱爲線程,我只需要再次聲明它? –

+0

如果完成1000次會發生什麼情況,那麼只有999個死線掛在內存中,或者每次線程重新定義時都會清理它們? –

+0

@SimonGreen:「名稱」是指向您的線程的變量的名稱。實際的線程沒有名稱,如果將變量設置爲新的線程實例,將會超出範圍 - 這將我們帶入第二個問題:當管理對象超出範圍時,它將被垃圾收集器(當它運行時)沒有更多的引用。垃圾收集器然後將收集該對象,從而釋放它保留的所有內存。所以**否**:你**不會**有999處死線,只有一個活動線程。 –