我有一个表单,我在其中启动一个任务来加载内容。如果用户单击取消,则当然需要取消该任务。但似乎我做错了什么。该表单永远不会关闭并持续等待任务:等待任务取消永久等待
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,那么你会得到这个行为 –