C# 使用Task.Delay()重置的值创建类

C# 使用Task.Delay()重置的值创建类,c#,.net,async-await,cancellationtokensource,cancellation-token,C#,.net,Async Await,Cancellationtokensource,Cancellation Token,我在C#windows服务中有一些标志值,我希望能够暂时更改这些标志值,但在一段时间后会自动恢复为一些默认值。全班的人都是这样的 public class Revertable<T> { public readonly T DefaultValue; public T Value { get; protected set; } public async Task SetValue(T newValue, TimeSpan resetDelay) {

我在C#windows服务中有一些标志值,我希望能够暂时更改这些标志值,但在一段时间后会自动恢复为一些默认值。全班的人都是这样的

public class Revertable<T>
{
    public readonly T DefaultValue;
    public T Value { get; protected set; }

    public async Task SetValue(T newValue, TimeSpan resetDelay)
    {
        Value = newValue;
        await Task.Delay(resetDelay);
        Value = DefaultValue;
    }

    public void ResetValue()
    {
        Value = DefaultValue;
    }
}

我对
async
编程有点陌生,我不想完全搞砸一些看起来应该相对简单的事情(或者留下一堆未处理的令牌源)。这似乎是一种有效的方法吗?或者有人能提出更好的方法吗?

你根本不需要线程或任务。只需使用时间戳并使用(非自动)属性保护字段

public class Revertable<T>
{
    public readonly T DefaultValue;
    public readonly TimeSpan ResetDelay;

    private T _currentValue;
    private DateTimeOffset _resetTime;

    public Revertable(T defaultValue, TimeSpan resetDelay)
    {
        this.DefaultValue = defaultValue;
        this.ResetDelay = resetDelay;
        _currentValue = defaultValue;
        _resetTime = DateTimeOffset.MinValue;
    }

    public T Value 
    { 
        get
        {
            return (System.DateTimeOffset.Now > _resetTime)
                ? DefaultValue 
                : _currentValue;
        }
        set
        {
            _currentValue = value;
            _resetTime = System.DateTimeOffset.Now.Add(this.ResetDelay); 
        }
    }
}

public static void Main()
{
    var r = new Revertable<string>("Default value", new TimeSpan(0,0,1));
    Console.WriteLine("Value is now {0}", r.Value);
    r.Value = "Changed";
    for (int i = 0; i<30; i++)
    {
        System.Threading.Thread.Sleep(100);
        Console.WriteLine("Value is now {0}", r.Value);
    }
}

完整的代码在上可用。

是否有效?您可以告诉我们您尝试的解决方案有哪些问题。我不会使用async/Wait,我会使用
MemoryCache
并有一个在延迟后过期的滚动窗口,任何缓存未命中都会返回默认值。@Servy似乎是,是的(我不得不使用语句删除
,因为它一直处于已处置状态)。我更关心的是这是否是一种好的方法,或者使用
异步
编程,或者是否存在我没有考虑的问题。我已经讨论了几天了。@ScottChamberlain有趣的想法。我实际上非常熟悉MemoryCache,所以这实际上是一个很有吸引力的替代方案。我必须探索一下。System.Dateime.UtcNow与System.DateTimeOffset.Now相比重量稍轻一些,可以用来做同样的计算。我想。我只是想养成好习惯,因为开发团队“DateTimeOffset是最常见的日期时间场景使用的新首选类型”。如果您真的担心性能,可以改用它。
public class Revertable<T>
{
    public readonly T DefaultValue;
    public readonly TimeSpan ResetDelay;

    private T _currentValue;
    private DateTimeOffset _resetTime;

    public Revertable(T defaultValue, TimeSpan resetDelay)
    {
        this.DefaultValue = defaultValue;
        this.ResetDelay = resetDelay;
        _currentValue = defaultValue;
        _resetTime = DateTimeOffset.MinValue;
    }

    public T Value 
    { 
        get
        {
            return (System.DateTimeOffset.Now > _resetTime)
                ? DefaultValue 
                : _currentValue;
        }
        set
        {
            _currentValue = value;
            _resetTime = System.DateTimeOffset.Now.Add(this.ResetDelay); 
        }
    }
}

public static void Main()
{
    var r = new Revertable<string>("Default value", new TimeSpan(0,0,1));
    Console.WriteLine("Value is now {0}", r.Value);
    r.Value = "Changed";
    for (int i = 0; i<30; i++)
    {
        System.Threading.Thread.Sleep(100);
        Console.WriteLine("Value is now {0}", r.Value);
    }
}
Value is now Default value
Value is now Changed
Value is now Changed
Value is now Changed
Value is now Changed
Value is now Changed
Value is now Changed
Value is now Changed
Value is now Changed
Value is now Changed
Value is now Default value
Value is now Default value
Value is now Default value
Value is now Default value
Value is now Default value