先上代码,疑问代码在最后一个方法: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、这个对象是可处置的,且必须处置。
- 1 回答
- 0 关注
- 492 浏览
添加回答
举报
0/150
提交
取消