首页 新闻 会员 周边 捐助

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

0
[已解决问题] 解决于 2015-04-05 21:35
先上代码,疑问代码在最后一个方法:

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<Bitmap> 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<bool>(); 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需要手动释放资源吗?
北在北方的主页 北在北方 | 初学一级 | 园豆:180
提问于:2015-04-04 00:39
< >
分享
最佳答案
0

没用过,不能给你正确的答案。

个人以为:

1、无返回的异步调用,await是不会等待的,而是直接走下一步

2、register执行的是注册,同时构建了一个对象

3、这个对象在异步调用里并没有被使用,因此长时间保留是没价值的

4、这个对象是可处置的,且必须处置。

奖励园豆:5
519740105 | 大侠五级 |园豆:5810 | 2015-04-04 10:36

几个对回答的疑问:

无返回指的是async方法返回void的吗?

可处置是的是手动释放资源?

 

北在北方 | 园豆:180 (初学一级) | 2015-04-05 21:24

@北在北方: 

无返回:指返回类型是void。

可处置:指实现了IDisposable接口。喊Dispose函数。using其实就是判断一个对象是否实现了这个接口,然后在跳出语句块的时候,调用实现接口Idisposable的方法Dispose。

519740105 | 园豆:5810 (大侠五级) | 2015-04-05 21:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册