我想知道如何取消任務。已經閱讀了一些這樣的文章:https ://docs.microsoft.com/en-us/dotnet/standard/threading/cancellation-in-managed-threads?redirectedfrom=MSDN
但是我已經完成了任務,想知道如何使它們可以取消。
一次全部完成,如果不可能,則應取消一項任務,然后他應取消下一項任務,直到所有任務都消失為止。
編輯這是正確使用 CancellationToken 嗎?任務繼續按我的意愿運行,但是當我按下取消按鈕時出現錯誤。如果我啟動我發布的版本,應用程式就會關閉: * 在此處輸入影像描述
void btnPause_Click(object sender, EventArgs e)
{
cts.Cancel();
}
async void btnStart_Click(object sender, EventArgs e)
{
try
{
cts = new CancellationTokenSource();
var token = cts.Token;
var t1 = Task.Run(() => START(token));
await Task.WhenAny(new[] { t1 });
}
catch (OperationCanceledException)
{
// Handle canceled
}
catch (Exception)
{
// Handle other exceptions
}
}
///////////////////////////////////////////
async void START(CancellationToken token)
{
for (int i = 0; i < 1; i )
{
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
try {
if()
{
}
}catch { }
}
Thread.Sleep(2000);
var t2 = Task.Run(() => START2(token));
await Task.WhenAny(new[] { t2});
}
///////////////////////////////////////////////
async void START2(CancellationToken token)
{
for (int i = 0; i < 10; i )
{
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
try {
if()
{
}
}catch { }
}
Thread.Sleep(7000);
var t3 = Task.Run(() => MOVE(token));
await Task.WhenAny(new[] {t3});
}
//////////////////////////////////////////
async void MOVE(CancellationToken token)
{
for (int i = 0; i < 3; i )
{
token.ThrowIfCancellationRequested();
await Task.Delay(100, token);
try {
if()
{
}
}catch { }
}
var t4 = Task.Run(() => MOVE2(token));
await Task.WhenAny(new[] {t4 });
}
uj5u.com熱心網友回復:
在一個稍微簡化的示例中使用 CancellationTokenSource:
CancellationTokenSource cts = new CancellationTokenSource();
async void Cancel_Click(object sender, EventArgs e)
{
cts.Cancel();
}
async void btnStart_Click(object sender, EventArgs e)
{
try{
cts = new CancellationTokenSource();
var token = cts.Token;
var t1 = Task.Run(() => Start(token));
var t2 = Task.Run(() => Start(token));
await Task.WhenAny(new []{t1, t2});
}
catch(OperationCancelledException){
// Handle canceled
}
catch(Exception){
// Handle other exceptions
}
}
void Start(CancellationToken token)
{
for (int i = 0; i < 100; i )
{
token.ThrowIfCancellationRequested();
// Do work
Thread.Sleep(100);
}
}
單擊按鈕時,它將首先創建一個新的 cancelTokenSource,然后在后臺執行緒上啟動兩個任務,這兩個任務都使用來自新創建的令牌源的令牌。當取消按鈕被按下時,令牌將被設定為取消狀態,并且下次每個后臺執行緒呼叫 ThrowIfCancellationRequested 時,它們將拋出例外。這會將任務置于取消狀態,等待此操作將引發需要捕獲的 operationCancelledException。請注意,在等待多個任務時,您可能會得到一個包含多個例外并需要解包的aggregateException 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/447845.html
上一篇:C#替換怪異
下一篇:Winform選取框進度條凍結
