gpt4 book ai didi

c# - 如何保证 CancellationTokens 是最新的?

转载 作者:太空狗 更新时间:2023-10-29 22:27:32 25 4
gpt4 key购买 nike

Microsoft 给出了这个 example CancellationToken 在 .NET 4 中的使用。

using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{

var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;

var task = Task.Factory.StartNew(() =>
{

// Were we already canceled?
ct.ThrowIfCancellationRequested();

bool moreToDo = true;
while (moreToDo)
{
// Poll on this property if you have to do
// other cleanup before throwing.
if (ct.IsCancellationRequested)
{
// Clean up here, then...
ct.ThrowIfCancellationRequested();
}

}
}, tokenSource2.Token); // Pass same token to StartNew.

tokenSource2.Cancel();

// Just continue on this thread, or Wait/WaitAll with try-catch:
try
{
task.Wait();
}
catch (AggregateException e)
{
foreach (var v in e.InnerExceptions)
Console.WriteLine(e.Message + " " + v.Message);
}

Console.ReadKey();
}
}

然而,my understanding是,如果一个变量在一个线程上被修改,另一个线程可能由于缓存而无法获得修改后的值。由于 CancellationToken 在主线程上被取消,Task 线程如何确保它正在检查的 CancellationToken 实际上是最新的日期?

为什么 Task 不可能读取 token 的缓存值?

注意:我问这个问题的动机是想知道我是否需要我的 CancellationToken 实例变量是 volatile

最佳答案

这是在 CancellationTokenSource 内部处理的。用于跟踪 CTS 状态的私有(private)变量标记为 volatile ,这可以防止内部状态检查过时。

My motivation in asking this arises from wondering whether I need my CancellationToken instance variables to be volatile.

您不需要这样做,因为检查是在内部处理的,并且已经为您妥善处理。

基本上,当您从 CancellationTokenSource 创建一个 CancellationToken 时, token 包含对原始源的引用。此引用永远不会更改,因此对 ThrowIfCancellationRequested 的调用会在内部检查源的状态。由于源状态本身是 volatile,因此它永远不会是“陈旧”数据。

关于c# - 如何保证 CancellationTokens 是最新的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11850207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com