我有一個表單,我在其中啓動一個任務來加載內容。如果用戶單擊取消,則當然需要取消該任務。但似乎我做錯了什麼。該表單永遠不會關閉並持續等待任務:等待任務取消永久等待
public partial class Designer : Form
{
private CancellationTokenSource _cancellationTokenSource;
private Task _loadTask;
private async void Designer_Shown(object sender, EventArgs e)
{
_cancellationTokenSource = new CancellationTokenSource();
try
{
_loadTask= Workbench.Instance.CurrentPackage.LoadObjects(_cancellationTokenSource.Token);
await _loadTask;
}
catch (Exception ex)
{
Debug.Print(ex.ToString());
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
_cancellationTokenSource.Cancel();
_loadTask.Wait(); //Waits forever
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
我的錯在哪裏?
編輯 代碼LoadObjects()
public Task LoadObjects(CancellationToken cancelToken)
{
return Task.Run(() =>
{
LoadParameters(cancelToken);
LoadConditionChecks(cancelToken);
LoadConditonRules(cancelToken);
LoadOperations(cancelToken);
}, cancelToken);
}
我通過令牌的子方法因爲迴路實際上是有...
任務取消需要運行,以檢查它是否被取消的任務。這聽起來好像不這樣做,但我不知道Workbench是什麼。 – Equalsk
您是否控制'Workbench.Instance.CurrentPackage.LoadObjects'的代碼。你確定它是尊重取消標記嗎? – Gusdor
代碼中接受'CancellationToken'的地方應該有一個像CancellationToken.IsCancellationRequested或CancellationToken.ThrowIfCancellationRequested這樣的取消檢查如果它不是隻有atb,那麼你會得到這個行爲 –