当任务发生时会发生什么';s已取消

本文关键字:取消 什么 任务 | 更新日期: 2023-09-27 18:28:38

我在玩Await/Async和CancellationTokens。我的代码是有效的,但是当任务被取消时会发生什么?它是否仍在占用资源,还是被垃圾收集?

这是我的代码:

    private CancellationTokenSource _token = new CancellationTokenSource();
    public Form1()
    {
        InitializeComponent();
    }
    async Task<String> methodOne()
    {
        txtLog.AppendText("Pausing for 10 Seconds 'n");
        var task = Task.Delay(10000, _token.Token);
        await task;
        return "HTML Returned. 'n";
    }
    private async void button1_Click(object sender, EventArgs e)
    {
        try
        {
            var task1 = methodOne();
            await task1;
            txtLog.AppendText(task1.Result + "'n");
            txtLog.AppendText("All Done 'n");
        }
        catch (OperationCanceledException oce)
        {
            txtLog.AppendText("Operation was cancelled");
        }
    }
    private void button2_Click(object sender, EventArgs e)
    {
        _token.Cancel();
    }

当任务发生时会发生什么';s已取消

当任务被取消时,它就完成了(处于取消状态)。它的行为与垃圾回收方面的任何其他对象一样:如果您没有对它的引用,它将被收集。

请注意,尽管Task确实实现了IDisposable,但除非使用IAsyncResult.AsyncWaitHandle成员,否则不必处理它。

任务只能同步取消(意味着它必须询问"我被取消了吗?"),因此任务很容易进行清理(例如使用using语句)。它分配的所有资源都会在之前或之后由GC释放(和往常一样,我们不知道GC什么时候会采取行动,除非我们执行GC.Collect(); GC.WaitForFinalizers();)。。。