我在阅读Stephen Cleary关于取消的博客文章时,在下面的代码片段中看到了我以前从未见过的东西。
Constructor() => CancelButton.Enabled = false;
private CancellationTokenSource? _cts;
async void StartButton_Click(..)
{
StartButton.Enabled = false;
CancelButton.Enabled = true;
// Create a CTS for manual cancellation requests.
using var cts = _cts = new();
try
{
// Pass the token for that CTS to lower-level code.
await DoSomethingAsync(_cts.Token);
.. // Display success in UI.
}
catch (Exception ex)
{
.. // Display error in UI.
}
finally
{
StartButton.Enabled = true;
CancelButton.Enabled = false;
}
}
async void CancelButton_Click(..)
{
// Manually cancel the CTS.
_cts!.Cancel();
}
特别是,using var cts = _cts = new();
这行代码。
using
关键字是否同时管理私有成员和局部变量的处理?
如果局部变量未被使用,为什么要进行赋值?
这段代码在做什么?
Dispose()
- 但它也被分配给了字段。 - Jon SkeetDispose()
是什么时候被调用的?当cts
和_cts
都超出范围时吗? - brent.reynolds_cts
从未被直接处理(如果您查看代码片段,这样做是不安全的,因为它可能会被另一个线程覆盖)。 - Matthew Watson