2016-08-13 4 views
-1

2週間ほど経ってからやってみたけど、たくさんの検索をして、ロジックの大部分を試してみました。C#Consoleアプリケーションで並列にスレッド(128など)を実行する方法は?

シナリオ:いくつかのタスク(非同期)を持つプログラムを実行すると、すべてのタスクがスレッドプールから新しいスレッドを使用することを望むように128(もっと大きくなることがあります)と言えます。

それぞれがシステムリソースから個々のスレッドを使用する500のタスクがあるとします。すべてが並行して実行される、すなわち、お互いに全く依存しない。

ありがとうございます。

本当にありがとうございました。

+0

'Task'sが' async'の場合、それらを並列に実行するためにそのような多数のスレッドは必要ありません。あなたが実際に何をしようとしているのかを説明し、あなたのコードを私たちにも示してくれたら助かります。 – svick

+0

実際に私は – hemantsharma

答えて

0

コンソールアプリケーションでは、非同期メソッドを直接使用することはできません。AsyncContexthttps://www.nuget.org/packages/Nito.AsyncEx)を使用します。

その後は、タスクを作成し、あなたが複数のスレッドでいくつかのタスクを実行したいと思われる

class Program 
{ 
    static void Main(string[] args) 
    { 
     //use AsyncContext, provided by the Nito.AsyncEx library 
     AsyncContext.Run(() => MainAsync(args)); 
    } 

    static async void MainAsync(string[] args) 
    { 
     var taskList = new List<Task>(); 
     for (int i = 0; i < 128; i++) 
     { 
      //add the new Task to the list and start to execute it 
      taskList.add(DoStuffAsync()); 
     } 

     //wait for all to finish 
     await Task.WhenAll(taskList); 
    } 

    private static async Task DoStuffAsync() 
    { 
     //do async stuff, like download from webpage 
    } 
} 
+0

これを作成するタスクの並列処理のパフォーマンスを分析する必要があります、私はそれを試みたが、彼らは個々のスレッドを使用していない、私は各スレッドの処理時間を計算したい。 – hemantsharma

0

非同期それらを実行することができます。 Async-Awaitは、あるスレッドが何か準備ができるまで待たなければならない間に、あるスレッドが他のものをやり遂げることを意図しています。

async-awaitを使用する理由と理由を理解するのに役立つ何かthis interview with Eric Lippert真ん中で非同期待機が検索されました。非同期のawaitを理解する私を助け

もう一つは、彼らが何かを待っている間、あなたが起動しようとしているスレッドが行うに何か有用なものを持っていない場合は、あなたがそれらを開始する使用することができthis article by the ever so helpful Stephen Cleary

た:

static class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Task> runningTasks = new List<Task>(); 
     IEnumerable<Action> thingsToDo = GetThingsToDo() 
     foreach (Action thingToDo in thingsToDo) 
     { 
      Task startedTask = Task.Run(() => thingToDo); 
      runningTasks.Add(startedTask); 
     } 
     // now that all tasks are started do something else 
     // after a while wait until all tasks finished 
     Task.WaitAll(runningTasks.ToArray()); 
    } 
} 

アクションの中で何かを待っている間に、あなたのアクションの1つを実行しているスレッドが意味のあることを行うことができる場合にのみ、asyncを宣言してアクションを待つことを検討し、Task.Run(async()=> ..)

しかし、それでもなお、あなたのメインスレッドは待つことができる機能にある必要はありません。他のすべてのスレッドを開始した後も、実行したいことは自由に実行できます。

+0

情報をありがとうが、私はシステムで利用可能なスレッドを使用して、マシン内のすべてのリソースを消費したい。 – hemantsharma

関連する問題