停止正在运行的任务

8

当任务正在运行时,我如何完全停止任务?

private async void button1_Click(object sender, EventArgs e)
{
  await Backup(file);
}

public async Task Backup(string File)
{
   await Task.Run(() =>
     {
       1)do something here

       2)do something here

       3)do something here

      });
}
private async void button2_Click(object sender, EventArgs e)
{
  <stop backup>
}

如果我想在第二个事情处理过程中停止任务,我会点击按钮2,然后任务将停止处理。

如何在button2_Click中取消或结束任务?


1
https://msdn.microsoft.com/zh-cn/library/hh160373(v=vs.110).aspx (附例子) - weston
1个回答

17
// Define the cancellation token source & token as global objects 
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token;

//when button is clicked, call method to run task & include the cancellation token 

private async void button1_Click(object sender, EventArgs e)
{
    token = source.Token;
    await Backup(file, token);
}

public async Task Backup(string File, CancellationToken token)
{
    Task t1 = Task.Run(()  =>
    {
        //do something here
    }, 
    token);
} 

//cancel button click event handler 
private async void cancelButton_Click(object sender, EventArgs e)
{
    if(source != null) 
    {
        source.Cancel();
    } 
}

//tasks
https://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx 

//CancellationToken
https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken(v=vs.110).aspx

我在 CancellationToken token = null; 这行代码中遇到了一个错误(无法将 null 转换为 'System.Threading.CancellationToken',因为它是一个非可空值)。 - James Wang
我认为在实例化任务时,你必须使用 source.Token。 - Jalali Shakib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接