如何取消正在运行的任务?

我想取消正在运行的任务(当用户按下转义键时)。 当我点击“转义”键时,Form_KeyDown运行但不取消任务!

CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationToken token=new CancellationToken(); private async void Search_Button_ClickAsync(object sender, EventArgs e) { token = tokenSource.Token; await (Task.Factory.StartNew(() => { //...my program }, token)); private void Form_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { tokenSource.Cancel(); } } 

除了你需要阻止你的代码在你的方法中运行之外,你做得很好。 通过将取消令牌传递给Task.Factory.StartNew,您不会中止任务。 让我引用Stephen Toub

将令牌传递到StartNew会将令牌与任务相关联。 这有两个主要好处:1)如果令牌在任务开始执行之前已请求取消,则任务将不会执行。 它不会转换为Running,而是立即转换为Canceled。 这样可以避免运行任务的成本,如果它在运行时只是被取消。 2)如果任务的主体也在监视取消令牌并抛出包含该令牌的OperationCanceledException(这是ThrowIfCancellationRequested所做的那样),那么当任务看到该OCE时,它会检查OCE的令牌是否与Task的令牌匹配。 如果是,则该exception被视为对协作取消的确认,并且任务转换到已取消状态(而不是故障状态)。

您需要手动检查您的令牌是否被取消并抛出操作取消exception,这些内容如下:

  private async void Search_Button_ClickAsync(object sender, EventArgs e) { cToken = cTokenSource.Token; await (Task.Factory.StartNew(() => { for(int i=0;i