2016-04-27 9 views
-1

コード:VB.NET - このコードはThreadPoolを正しく実行しますか?

'Get the Thread Count - Lets say this value was 150; 
Dim threads As Integer = CheckerThreads.Value 

'Set the Thread Count; 
ThreadPool.SetMinThreads(threads, threads) 
ThreadPool.SetMaxThreads(threads, threads) 
ServicePointManager.DefaultConnectionLimit = threads 
ServicePointManager.Expect100Continue = True 

'For Each proxy from the Opened File; 
For Each Proxy In proxies 

    'Check the Proxy; 
    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf CheckProxy), Proxy) 

Next 

上記のコード、各プロキシがList()から取得し、単にプロキシをチェックするためにWebRequestクラスを使用していますが、関連していないthatsの、私はFor Each私が持っている方法を使用している思ったんだけど何を、私はそれがそうだと思うように実行している、または私は間違って何かをしたことがありますか?何が起こっている次の?:

1を

は - 150の過程で確認されている1つのプロキシですか?

- または -

2 - それは150の処理を同時にチェックすると、プロセスごとに1つのプロキシをチェックしていますか?

それは#1をやっている場合、どのように私はそれが#2を行うには解決できますか?

+0

あなた自身の質問に簡単に答えることができます。プロキシを確認する以外の操作を行います(例:コンソールに番号を書いて、同じ番号を150回取得するか、150の異なる番号を取得するかを確認します。また、あなたが呼んでいる 'Set'メソッドのドキュメントを読みましたか? – jmcilhinney

+0

@jmcilhinneyコンソールについての良いアイデアだが、 "設定"方法の意味はない。 – ShinyMK

+0

@jmcilhinney [OK]をテストし、それを行う#2、しかし、ちょっと混乱して、それは実際に同じ時間に実行されている、または1つの終了後にですか? – ShinyMK

答えて

1

スレッドに割り当てられたタスクは、同じ時間枠で実行されます。 2つのタスクを実際に正確に同時に処理できる唯一の方法は、複数のプロセッサコアによるものであるため、私はそのように言います。明らかに150個のプロセッサーコアがないので、150個のタスクを同時に処理することはできません。プロセッサは非常に高速に動作するため、それらは同時に処理されることが肉眼で見えるため、インターリーブされます。

私はあなたが関連する文書を読むことを提案した理由は、スレッド数を混乱させると実際にパフォーマンスが低下することがあるからです。非常に多くのスレッドをアクティブにすると、すべてのコンテキスト切り替えのために物事が遅くなる可能性があります。一般的には、すべてのメッセージをキューに入れ、システムが残りの部分を処理するようにするのが最良です。

+0

ありがとう!だから、私のループは実行して、すべてのプロキシをできるだけ速く完璧にチェックするように設定されています。そして、はい、処理スレッド数を設定することでパフォーマンスが低下することがわかります。これは、UpDownNumericalValueやそれが呼び出された回数に値が掛かっている理由です。したがって、ユーザーがスレッドをあまりにも多く見つけた場合は、スレッドを低くしたり、高くしたりすることができます。ありがとう – ShinyMK