2017-10-15 10 views
0

私は週末に読んで、マルチネットを.netで研究してきましたが、私が理解できない1つの質問があります。multithreading scope

私はボタンがあり、このボタンをクリックするとAmazon S3にファイルをアップロードしたいと思いますが、このアップロードタスクは数秒かかると思います。これはスレッドが入ってくる場所です。

それで、ユーザーがボタンをもう一度クリックすると、最初のスレッドが完全に終了しない限り、別のスレッドを開始してファイルをアップロードしたくない場合は、試してみてください冗長性を避けるためです。

どこでも私はマルチスレッドでは必要なときにスレッドを宣言していると説明しましたが、ボタンでクリックすれば必ず2回目のスレッドの名前と競合が発生しますすでに同じ名前のスレッドが存在します。

私の解決策は、クラスの先頭にスレッドを宣言することでした。ファイルをアップロードするコードでサブを作成します。ボタンがクリックされたときにスレッドが実行前に生きているかどうかを確認してください。 しかし、私はそれが終わったらスレッドを最初からやり直すことができないことを知りました。

だから私はかなり理解できませんが、別のスレッドで複数回実行する必要があるタスクを管理する方法です。毎回新しいスレッドを作成することを期待していますか?これは、固有の名前を持つ新しいスレッドを作成する必要があることを意味しますか?一度完了したらスレッドにはどうなりますか?私はスレッドを中止することは非常に悪いことを読んだが、私は何もしていない、それを削除することができない永遠にそこに残すことを期待していますか?これは、アプリケーションが長時間実行されていて、何も実行していない何千もの「死んだ」スレッドがある可能性があるということですか?

ここでは、人々のためのものを簡単にする場合に行うことのマークアップ版です。

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: "name"はあなたのスレッドを指す変数の名前です。実際のスレッドは名前を持たず、変数を新しいスレッドインスタンスに設定するとスコープから外れます。これは、2番目の質問につながります。管理オブジェクトが有効範囲外になると、ガベージコレクタによって検出されます(それが実行されるとき)それへのそれ以上の参照を持たないとして。ガベージコレクタはオブジェクトを収集し、予約したすべてのメモリを解放します。だから** no **:あなたは**死んだスレッド999を持っていません**、アクティブなスレッドは1つだけです。 –