c#

c# progress如何处理用户取消

小樊
81
2024-11-28 22:56:26
栏目: 编程语言

在C#中,处理用户取消通常涉及到异步编程和事件处理。以下是一个简单的示例,展示了如何在C#中处理用户取消操作:

  1. 首先,创建一个异步方法来执行长时间运行的任务,并在其中处理用户取消:
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await LongRunningTaskAsync();
    }

    static async Task LongRunningTaskAsync()
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        CancellationToken token = cts.Token;

        // 模拟长时间运行的任务
        for (int i = 0; i < 10; i++)
        {
            if (token.IsCancellationRequested)
            {
                Console.WriteLine("任务已取消。");
                return;
            }

            Console.WriteLine($"正在进行第 {i + 1} 次迭代...");
            await Task.Delay(1000, token);
        }

        Console.WriteLine("任务完成。");
    }
}

在这个示例中,我们创建了一个名为LongRunningTaskAsync的异步方法,该方法接受一个CancellationToken参数。我们在循环中检查CancellationToken是否已请求取消,如果是,则退出循环并返回。

  1. 在主方法中,我们创建一个CancellationTokenSource实例,并将其传递给LongRunningTaskAsync方法。这样,我们可以在需要时调用Cancel方法来通知任务取消。
static async Task Main(string[] args)
{
    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken token = cts.Token;

    // 可以在此处添加代码以响应用户操作(例如,按钮点击)来触发取消
    // cts.Cancel();

    await LongRunningTaskAsync(token);
}
  1. 如果需要在用户界面中处理取消操作,可以监听CancellationTokenCanceled事件。例如,在Windows Forms应用程序中,可以在窗体类中添加以下代码:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private async void btnStart_Click(object sender, EventArgs e)
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        CancellationToken token = cts.Token;

        // 可以在此处添加代码以响应用户操作(例如,按钮点击)来触发取消
        // cts.Cancel();

        await LongRunningTaskAsync(token);
    }

    static async Task LongRunningTaskAsync(CancellationToken token)
    {
        for (int i = 0; i < 10; i++)
        {
            if (token.IsCancellationRequested)
            {
                Console.WriteLine("任务已取消。");
                return;
            }

            Console.WriteLine($"正在进行第 {i + 1} 次迭代...");
            await Task.Delay(1000, token);
        }

        Console.WriteLine("任务完成。");
    }
}

在这个示例中,我们在btnStart_Click方法中创建了一个CancellationTokenSource实例,并将其传递给LongRunningTaskAsync方法。当用户点击按钮时,可以调用cts.Cancel()来触发取消操作。在LongRunningTaskAsync方法中,我们检查CancellationToken是否已请求取消,并在适当的时候退出循环并返回。

0
看了该问题的人还看了