2010-09-29 14 views
2

J'ai deux boucles while, que j'aurai exécutées en parallèle avec le TPL.Y at-il une chance de remplacer une boucle while avec le TPL?

Mon code:

public void Initialize() 
{ 
    cts = new CancellationTokenSource(); 

    ParallelOptions options = new ParallelOptions(); 
    options.CancellationToken = cts.Token; 
    options.MaxDegreeOfParallelism = Environment.ProcessorCount; 

    task = Task.Factory.StartNew(() => Parallel.Invoke(options, Watcher1, Watcher2), cts.Token); 
} 

public void Watcher1() 
{ 
    //Can I replace this (with a TPL construct in the initialize method)? 
    while(true) 
    { 
     //Do sth. 
    } 
} 

public void Watcher2() 
{ 
    //Can I replace this (with a TPL construct in the initialize method)? 
    while(true) 
    { 
     //do sth 
    } 
} 

Ce serait bien, si je peux annuler ces deux actions en toute sécurité. Pouvez-vous me donner quelques conseils?

Merci d'avance.

Meilleures salutations, pro

Répondre

2

Vous pouvez le faire en utilisant un CancellationTokenSource, voir this article pour plus de détails

2
public void Initialize() 
{ 
    var cancellationSource = new CancellationTokenSource(); 
    var cancellationToken = cancellationSource.Token; 

    //Start both watchers 
    var task1 = Task.Factory.StartNew(() => Watcher1(cancellationToken)); 
    var task2 = Task.Factory.StartNew(() => Watcher2(cancellationToken)); 

    //As an example, keep running the watchers until "stop" is entered in the console window 
    while (Console.Readline() != "stop") 
    { 
    } 

    //Trigger the cancellation... 
    cancellationSource.Cancel(); 

    //...then wait for the tasks to finish. 
    Task.WaitAll(new [] { task1, task2 }); 
} 

public void Watcher1(CancellationToken cancellationToken) 
{ 
    while (!cancellationToken.IsCancellationRequested) 
    { 
     //Do stuff 
    } 
} 

public void Watcher2(CancellationToken cancellationToken) 
{ 
    while (!cancellationToken.IsCancellationRequested) 
    { 
     //Do stuff 
    } 
}