0

この質問は 2 つの部分に分かれています。複数のサーバーから情報を取得し、この情報を DB に保存するコンソール アプリケーションがあります。これを同時に実行できるようにするために、スレッドを使用しました。この実行を毎分自動化しようとしています。

stackoverflow を検索すると、これが機能することがわかりました。

   var timer = new System.Threading.Timer((e) =>
        {
            var models = ServerHandler.GetServerModels();

            foreach (var m in models)
            {
                ServerHandler.MakeThreads(m);
            }

            Console.WriteLine("Running...");
            Console.WriteLine("Press 'X' to exit or close the window, i : " + i);

            i++;


        }, null, 0, TimeSpan.FromMinutes(1).Seconds);

ただし、これは期待どおりに機能せず、1 回しか実行されません。たとえば、これに変更した場合:

TimeSpan.FromMinutes(0.5).Seconds

または:

TimeSpan.FromSeconds(30).Seconds

その後、動作します。私は何を間違っていますか?

この質問の後半:

上で示したようにこれが実際に機能すると、別のことが起こります。プロセスは継続的に実行され、474 スレッドの後にクラッシュし、システムのメモリが不足していると表示されます。

これにスレッドスリープを使用してみましたが、一度実行すると実行が停止します。

役立つ場合は、これを含めます。

public static void MakeThreads(ServerModel model)
{
    Thread thread = new Thread(() => SaveServerInfo(model));
    thread.Start();
    //Thread.Sleep(1);
    //thread.Join();

}

どうすればこれを機能させることができますか?

4

2 に答える 2

2

最初の問題では、.Seconds を使用すると秒の値のみが返されますが、分の値を .5 として定義しているため、秒は常にゼロになります。

秒を返したい場合は、TotalSeconds を使用する必要があります

TimeSpan.FromMinutes(0.5).TotalSeconds

使用しているタイムスパンでは、ミリ秒を定義することになっています。したがって、30000 ミリ秒ごとではなく 30 ミリ秒ごとに実行されるため、膨大な数のスレッドを取得しています。

だから使う

TimeSpan.FromMinutes(0.5).TotalMilliseconds

または私がいつもより簡単に見つけるもの

(int)(1000 * 60 * 0.5)  // Then you just replace the 0.5 with the number of seconds. 
于 2016-03-22T13:51:18.433 に答える