2

テストをロードする (http: GET を送信する) ツールを作成していますが、正常に実行されますが、メモリ不足エラーのために最終的に停止します。

質問:このループが継続的に実行され、エラーが発生しないように、スレッドをリセットするにはどうすればよいですか?

    static void Main(string[] args)
    {
       System.Net.ServicePointManager.DefaultConnectionLimit = 200;

       while (true)
        {
            for (int i = 0; i < 1000; i++)
            {
                new Thread(LoadTest).Start(); //<-- EXCEPTION!.eventually errs out of memory
            }
            Thread.Sleep(2);
        }
    }

    static void LoadTest()
    {
        string url = "http://myserv.com/api/dev/getstuff?whatstuff=thisstuff";

        // Sends http get from above url ... and displays the repose in the console....
    }
4

3 に答える 3

1

スレッドを左右中央にインスタンス化しています。これはおそらくあなたの問題です。交換したい

new Thread(LoadTest).Start();

Task.Run(LoadTest);

これにより、リソースを使用して毎回新しいスレッドを作成する代わりに、ThreadPool 内のスレッドで LoadTest が実行されます。でも。これにより、別の問題が明らかになります。

ThreadPool のスレッドは限られたリソースであり、できるだけ早く Threads を ThreadPool に戻す必要があります。APM 方式ではなく、同期ダウンロード方式を使用していると思います。これは、リクエストがサーバーに送信されている間、リクエストを生成したスレッドが他の作業を行うためにオフになるのではなく、スリープしていることを意味します。

どちらかを使用します(.net 4.5を想定)

var client = new WebClient();
var response = await client.DownloadStringTaskAsync(url);
Console.WriteLine(response);

または、コールバックを使用します (.net 4.5 でない場合)

var client = new WebClient();
client.OnDownloadStringCompleted(x => Console.WriteLine(x));
client.BeginDownloadString(url);
于 2013-02-25T20:21:05.097 に答える
1

何千ものスレッドを作成する代わりに、ThreadPoolを使用し、QueueUserWorkItem を使用します。スレッドは高価なオブジェクトであり、メモリが不足していることは驚くことではありません。また、非常に多くのスレッドを使用すると、(テスト ツールで) パフォーマンスを発揮できなくなります。

于 2013-02-25T20:07:41.373 に答える
1

コード スニペットは多くのスレッドを作成し、最終的にメモリ不足になるのも不思議ではありません。ここではスレッド プールを使用することをお勧めします。コードは次のようになります。

    static void Main(string[] args)
    {
        System.Net.ServicePointManager.DefaultConnectionLimit = 200;
        ThreadPool.SetMaxThreads(500, 300);
        while (true)
        {
            ThreadPool.QueueUserWorkItem(LoadTest);
        }
    }

    static void LoadTest(object state)
    {
        string url = "http://myserv.com/api/dev/getstuff?whatstuff=thisstuff";
        // Sends http get from above url ... and displays the repose in the console....
    }
于 2013-02-25T20:14:17.887 に答える