为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2018-12-07 02:43:54
先上代码,疑问代码在最后一个方法: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需要手动释放资源吗?
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

没用过,不能给你正确的答案。 个人以为: 1、无返回的异步调用,await是不会等待的,而是直接走下一步 2、register执行的是注册,同时构建了一个对象 3、这个对象在异步调用里并没有被使用,因此长时间保留是没价值的 4、这个对象是可处置的,且必须处置。
查看完整回答
反对 回复 2018-12-09
  • 1 回答
  • 0 关注
  • 492 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信