TaskScheduler avec séquentiel asynchrone Tasks C #

J’exécute des scripts .py async. Un script prend environ 30 secondes à exécuter. Il se peut que deux ou même plusieurs scripts soient sélectionnés dans un délai de deux ou trois secondes. L’objective est d’avoir un planificateur qui collecte toutes les tâches et les exécute les unes après les autres. Une fonctionnalité FIFO devrait être incluse. J’ai essayé le code suivant simplement pour essayer les fonctionnalités de queuedTaskScheduler, mais même cela ne fonctionne pas.

QueuedTaskScheduler queueScheduler; private TaskScheduler ts_priority1; int pos = 0; public Form1() { InitializeComponent(); queueScheduler = new QueuedTaskScheduler(targetScheduler: TaskScheduler.Default, maxConcurrencyLevel: 1); ts_priority1 = queueScheduler.ActivateNewQueue(1); } private void button3_Click(object sender, EventArgs e) { QueueValue(pos, ts_priority1); pos++; } private void button4_Click(object sender, EventArgs e) { changeSsortingng(pos); pos++; } private void changeSsortingng (int position) { var bea = "This is Thread " + position + " starting"; MethodInvoker Labelupdate = delegate { label2.Text = bea; }; Invoke(Labelupdate); Thread.Sleep(3000); bea = "Thread " + position + " is ending"; MethodInvoker Labelupdate1 = delegate { label2.Text = bea; }; Invoke(Labelupdate1); Thread.Sleep(1000); } private void updateLabel (ssortingng Lab) { MethodInvoker Labelupdate = delegate { label2.Text = Lab; }; Invoke(Labelupdate); } private Task QueueTask(Func f, TaskScheduler ts) { return Task.Factory.StartNew(f, CancellationToken.None, TaskCreationOptions.HideScheduler | TaskCreationOptions.DenyChildAttach, ts); } private Task QueueValue(int position, TaskScheduler ts) { return QueueTask(async () => { label2.Text = "This is Thread " + position + " starting"; Thread.Sleep(3000); label2.Text = "Thread " + position + " is ending"; Thread.Sleep(1000); }, ts); } 

Je l’ai résolu. Il suffit d’un sémaphore. C’est la même manière que dans ce fil de discussion. Voici le code:

 private static SemaphoreSlim semaphore = new SemaphoreSlim(1); private Task QueueValue(int position, TaskScheduler ts) { return QueueTask(async () => { await semaphore.WaitAsync(); try { var at = "This is Thread " + position + " starting"; updateLabel(at); await Task.Delay(3000); at = "Thread " + position + " is ending"; updateLabel(at); await Task.Delay(1000); } finally { semaphore.Release(); } }, ts); } 

Merci beaucoup!