Task异步编程代码求解释:using(ct.Register(()=>{tcs.TrySetResult(true);}))

先上代码,疑问代码在最后一个方法:private CancellationTokenSource m_cts; public void btnCancel_Click(object sender, EventArgs e) { if (m_cts != null) m_cts.Cancel(); } public async void btnRun_Click(object sender, EventArgs e) { m_cts = new CancellationTokenSource(); btnRun.Enabled = false; try { Task imageDownload = GetBitmapAsync(txtUrl.Text); await UntilCompletionOrCancellation(imageDownload, m_cts.Token); if (imageDownload.IsCompleted) { Bitmap image = await imageDownload; panel.AddImage(image); } else imageDownload.ContinueWith(t => Log(t)); } finally { btnRun.Enabled = true; } } private static async Task UntilCompletionOrCancellation( Task asyncOp, CancellationToken ct) { var tcs = new TaskCompletionSource(); using(ct.Register(() => tcs.TrySetResult(true)))//这段代码中的using await Task.WhenAny(asyncOp, tcs.Task); return asyncOp; }问题:using(ct.Register(()=>tcs.TrySetResult(true)))这行代码为什么用using?我知道using会自动释放资源,可我用Task从来没有手动释放资源,使用Task需要手动释放资源吗?
呼唤远方
浏览 493回答 1
1回答

凤凰求蛊

没用过,不能给你正确的答案。 个人以为: 1、无返回的异步调用,await是不会等待的,而是直接走下一步 2、register执行的是注册,同时构建了一个对象 3、这个对象在异步调用里并没有被使用,因此长时间保留是没价值的 4、这个对象是可处置的,且必须处置。
打开App,查看更多内容
随时随地看视频慕课网APP