Nie jest mi trudno zrozumieć rzeczywiste zachowanie w tym scenariuszu. Co się właściwie dzieje, aby nie wykonać zadania, kiedy powinno, ale później, kiedy SemaphoreSlim zostanie rozwiązany. To rzuca mi następujące exception- System.ObjectDisposedException {"The semaphore has been disposed."}
Co jest nie tak w kodzie do
Mam Biblioteka klasy jak -
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();
}
});
}
}
}
}
i używając go jak-
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();
}
}
może ktoś proszę obsypany trochę światła na to? Z góry dziękuję.
dziękuję za wyjaśnienie kolejność realizacji. To jest moje złe :(Nie zauważyłem błędów związanych z używaniem "używania" i "zadania". –