class Program
{
static IEnumerable<site> list = Enumerable.Range(1, 10).Select(i => new site(i.ToString()));
static void Main(string[] args)
{
startup();
Console.ReadKey();
}
static public void startup()
{
router.cts = new CancellationTokenSource();
foreach (var s in list)
{
update(s);
}
}
async static public void update(site s)
{
try
{
while (true)
{
await s.Refresh();
if (site.count % 4 == 0)
{
Console.WriteLine("Reseting Queue");
router.cts.Cancel();
}
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled");
startup();
}
}
}
class router
{
public static SemaphoreSlim ss = new SemaphoreSlim(1);
public static CancellationTokenSource cts { get; set; }
}
class site
{
public static int count = 0;
public string sitename {get; set;}
public site(string s)
{
sitename = s;
}
async public Task Refresh()
{
await router.ss.WaitAsync(router.cts.Token);
//Console.WriteLine("{0}:: Start Refreshing ", sitename);
await Task.Delay(1000);
Console.WriteLine("{0}:: Done Refreshing ", sitename);
count++;
router.ss.Release();
}
}
Sto tentando di simulare un modello che avvia un ciclo infinito che simula un aggiornamento costante di un sito. Sto imitando questo con il modulo. In teoria mi piacerebbe che questo annulasse tutti i compiti accodati dal semaforo e riavvia la coda dall'inizio, ma sembra che non lo faccia. Qualcuno potrebbe commentare la mia logica e il mio schema?Token di cancellazione semaforo
l'uscita in questo momento appare così ::
1:: Done Refreshing
2:: Done Refreshing
3:: Done Refreshing
4:: Done Refreshing
Reseting Queue
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
5:: Done Refreshing
1:: Done Refreshing
2:: Done Refreshing
3:: Done Refreshing
Reseting Queue
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
4:: Done Refreshing
5:: Done Refreshing
6:: Done Refreshing
7:: Done Refreshing
Reseting Queue
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
Canceled
8:: Done Refreshing
9:: Done Refreshing
10:: Done Refreshing
1:: Done Refreshing
Reseting Queue
Canceled
Vuoi che i siti vengano aggiornati in parallelo o uno per uno? – i3arnon
Voglio che si aggiornino in parallelo ma il semaforo serve a simulare un codice che deve avere un blocco su di esso. – cubesnyc
@YevgenyYurgenson, è un seguito alla tua [domanda precedente] (http://stackoverflow.com/q/24020740/1768303)? Qual è il punto di avere 'SemaphoreSlim (1)'? Non vuoi avere più di 1 operazione allo stesso tempo? – Noseratio