Es macht mich wenig schwer, das tatsächliche Verhalten in diesem Szenario zu verstehen. Was passiert, wenn die Aufgabe nicht ausgeführt wird, wenn SemaphoreSlim entsorgt wird? Es wirft mich exception- folgende System.ObjectDisposedException {"The semaphore has been disposed."}
Was ist falsch im Code zu
ich eine Klassenbibliothek wie haben -
public class ParallelProcessor
{
private Action[] actions;
private int maxConcurrency;
public ParallelProcessor(Action[] actionList, int maxConcurrency)
{
this.actions = actionList;
this.maxConcurrency = maxConcurrency;
}
public void RunAllActions()
{
if (Utility.IsNullOrEmpty<Action>(actions))
throw new Exception("No Action Found!");
using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(maxConcurrency))
{
foreach (Action action in actions)
{
Task.Factory.StartNew(() =>
{
concurrencySemaphore.Wait();
try
{
action();
}
finally
{
concurrencySemaphore.Release();
}
});
}
}
}
}
Und es wie-
class Program
{
static void Main(string[] args)
{
int maxConcurrency = 3;
Action[] actions = new Action[] {() => Console.WriteLine(1),() => Console.WriteLine(2),() => Console.WriteLine(3) }; //Array.Empty<Action>();
ParallelProcessor processor = new ParallelProcessor(actions, maxConcurrency);
processor.RunAllActions();
Console.ReadLine();
}
}
Könnte jemand bitte etwas Licht auf sie überschüttet mit? Danke im Voraus.
Vielen Dank zur Erläuterung der Reihenfolge der Ausführung der Verwendung oder entfernen entfernen. Es ist mein Schlechter :(Ich habe die Fehler nicht bemerkt, wenn ich "using" und "Task" benutze. Nochmals danke. –