請如果有人能幫助我。 我正在嘗試使用TPL鏈接的取消標記。問題是取消主CancellationTokenSource後,鏈接標記屬性IsCancellationRequested的值仍爲「false」。C#任務 - 鏈接的取消令牌不起作用
我開始了兩項任務,只是要確定 - 但它應該是同樣的事情。第一次傳遞CancellationToken,第二次傳遞CancellationTokenSource。行爲是一樣的:在while循環中 - 條件linkedToken.IsCancellationRequested在取消後保持「false」。
這裏是我使用的代碼:
public class Manager
{
private Task tokenTask;
private Task sourceTask;
private CancellationTokenSource mainCancelationTokenSource;
private CancellationToken mainToken;
public Manager()
{
this.mainCancelationTokenSource = new CancellationTokenSource();
this.mainToken = mainCancelationTokenSource.Token;
this.mainToken.Register(MainCanceled);
}
public void Start()
{
Workers w = new Workers();
tokenTask = Task.Run(() => w.DoWorkToken(mainToken), mainToken);
sourceTask = Task.Run(() => w.DoWorkSource(mainCancelationTokenSource), mainCancelationTokenSource.Token);
}
public void Cancel()
{
mainCancelationTokenSource.Cancel();
}
private void MainCanceled()
{
try
{
tokenTask.Wait();
}
catch (Exception e)
{
}
try
{
sourceTask.Wait();
}
catch (Exception e)
{
}
}
}
class Workers
{
public void DoWorkToken(CancellationToken mainToken)
{
CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource(mainToken);
CancellationToken linkedToken = linkedCts.Token;
while (!linkedToken.IsCancellationRequested)
{
Random r = new Random();
Task.Delay(200 * r.Next(1, 11)).Wait();
}
linkedToken.ThrowIfCancellationRequested();
}
public void DoWorkSource(CancellationTokenSource mainCts)
{
CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource(mainCts.Token);
while (!linkedCts.Token.IsCancellationRequested)
{
Random r = new Random();
Task.Delay(200 * r.Next(1, 11)).Wait();
}
linkedCts.Token.ThrowIfCancellationRequested();
}
}
從一個控制檯應用程序的主要方法啓動此代碼:
class Program
{
static void Main(string[] args)
{
Manager manager = new Manager();
manager.Start();
//Console.ReadKey();
Thread.Sleep(5000);
manager.Cancel();
}
}
謝謝您的幫助!
謝謝你的回答。當我刪除回調,一切正常。但只是要清楚,我已經改變了條件,而while循環爲:while(!mainToken.IsCancellationRequested)'。 (這是來源被取消的令牌 - 在另一個while循環中,我分別對源進行條件處理)。我已將回調加回。這個令牌被取消,任務結束,回調中的Wait()結束並且一切正常。我可以得出結論:鏈接源被放到這個「回調」列表中,但源本身被取消,儘管註冊回調? – Thomas
@Thomas你是對的,我的部分錯誤,我已經更新了我的答案。 – Evk
再次感謝您的回答。 – Thomas