7

我在玩 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();
    }
4

2 回答 2

2

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

请注意,尽管Task确实实现了IDisposable,但除非您使用member ,否则您不必处置它IAsyncResult.AsyncWaitHandle

于 2013-08-21T12:14:49.897 回答
0

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

于 2013-08-21T12:14:42.833 回答