SemaphoreSlim
とTask.Run()
を使用してマルチスレッドを実行するコードを作成しようとしています。ここでなぜこのTask.Runラムダは同期的に実行されますか?
は抜粋です:完全かつsemaphore.Release()
いくつかのタスクがスレッドを解放するまで、私が起こることを期待したもの
var semaphore = new SemaphoreSlim(50, 50);
foreach (var item in collection)
{
semaphore.Wait();
Task.Run(() =>
{
item.Property = DoTheThing(item.AnotherValue).Result;
db.SaveChanges();
semaphore.Release();
});
}
は50個のタスクがキューに入れられ、その後semaphore.Wait()
されるだろうということであることでキックとforeachループを開催しますより多くをキューに入れることができます。
実際には、コードは同期して順番に実行されます。私はここで何が欠けていますか?私はTask.Run()
が新しいスレッドでラムダコードを開始したと思いましたか?
'Task.Run()'はあなたが待っていない 'Task'オブジェクトを返します。 – siride
@siride正確には、SemaphoreSlimを使用して、開始するタスクの数を制御しています。私は非ラムダ式でこのパターンを使用していますが、ラムダ式では何らかの理由で動作せず、シングルスレッドのみが実行されます – Guerrilla
@Guerrilla:私はまだこれに新しいですが、私はあなたが望むかもしれないと思いますタスクの配列を作成し、その配列に 'Task.WhenAll()'を使用することです。ラムダ内でセマフォ待機を行うことができます。 – siride