先上代码,疑问代码在最后一个方法:
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需要手动释放资源吗?
没用过,不能给你正确的答案。
个人以为:
1、无返回的异步调用,await是不会等待的,而是直接走下一步
2、register执行的是注册,同时构建了一个对象
3、这个对象在异步调用里并没有被使用,因此长时间保留是没价值的
4、这个对象是可处置的,且必须处置。
几个对回答的疑问:
无返回指的是async方法返回void的吗?
可处置是的是手动释放资源?
@北在北方:
无返回:指返回类型是void。
可处置:指实现了IDisposable接口。喊Dispose函数。using其实就是判断一个对象是否实现了这个接口,然后在跳出语句块的时候,调用实现接口Idisposable的方法Dispose。