2017-12-01 16 views
1

私はディレクトリパスでいっぱいのリストボックスを含むアプリを持っています。バックグラウンドワーカーの複数のインスタンスを実行できますか?

私は各ディレクトリパスをループし、各パスに設定されているアクセス許可を引き出しています。

私はそうのように呼ばれ、最初に関数としてこれを持っていた...

For Each dirpath In ListBox3.Items 
    CalculatePermissions(dirpath) 
Next 

これは動作しますが、作業が行われていた一方で、もちろん私のアプリは、長い期間のためにハングアップすると応答しなくなるだろう。私はすべてのディレクトリとサブディレクトリを再帰的に見ているので、多くの結果が出る可能性があります。

私は、BackgroundWorkerのに機能を変更し、非同期的にそうようにそれを呼び出してみました...

For Each dirpath In ListBox3.Items 
    bgw_CalcPermissions(dirpath) 
Next 

私はこれと私のBGWでDIRPATH引数をつかんで...

Dim path As String = CStr(e.Argument) 

これは働いていました治療は...アプリケーションがハングしていないし、ディレクトリがループされて...問題は、それはリストボックスの最初のパスのためにのみ動作します。バックグラウンドワーカーがビジーで処理できないため、残りはすべてスキップされます。

作業を実行するために作業したバックグラウンドの複数のインスタンスを作成することは可能ですか、これを別の方法で行うべきですか?

答えて

4

.NET Framework 4.5以降の.NETで非同期プログラミングのTAPパターンを見てみることを強くお勧めします。 TaskクラスとAsyncおよびAwaitキーワードを使用すると、非同期コードを読みやすく保守しやすくなります。

ただし、バックグラウンドワーカーを使用しても、Parallel.ForEachメソッドを呼び出すことで、これを簡単に行うことができます。 、そして、

Dim paths As IEnumerable(Of String) = ListBox1.Items.OfType(Of String).ToArray() 
bgw_CalcPermissions(paths) 

バックグラウンドワーカーイベントハンドラでは、あなたが呼び出すことができます、あなたではなく単一の項目よりも、バックグラウンドワーカーへの項目の完全なリストを送信するように、あなたが最初にそれを変更する必要があるだろうということを行うにはParallel.ForEachは次のとおりです。

Dim paths As IEnumerable(Of String) = DirectCast(e.Argument, IEnumerable(Of String)) 
Parallel.ForEach(paths, AddressOf CalcPermissions) 
関連する問題