如何让变量在C#定时器循环中保留其值
问题修复方案
核心原因
你每次定时器触发时都会新建Collection实例,实例内部修改的是自身私有字段initialValueOffer,但静态类OfferVariables里的initialValueOfferFlowerLolitaCollections从未被更新。下次新建实例时,依然传入静态变量的初始值0,导致每次循环都重置。
两种修复方案
方案一:复用同一个Collection实例(推荐)
不要每次定时器触发都新建实例,提前初始化一次并保存,每次循环直接调用该实例的ExecuteAsync方法,这样实例内部的initialValueOffer会保留上次循环的修改值。
修改定时器相关代码:
// 静态变量保存Collection实例,避免每次新建 private static Collection _flowerLolitaCollections; static async Task Main() { // 初始化一次实例,传入静态变量的初始值 _flowerLolitaCollections = new Collection(OfferVariables.initialValueOfferFlowerLolitaCollections /* 其他参数 */); timer = new Timer(TimeSpan.FromSeconds(10).TotalMilliseconds); timer.Elapsed += async (sender, e) => await TimerElapsedAsync(); timer.Start(); Console.WriteLine("Press Enter to exit."); Console.ReadKey(); timer.Stop(); timer.Dispose(); } private static async Task TimerElapsedAsync() { // 直接复用已创建的实例,无需每次新建 await _flowerLolitaCollections.ExecuteAsync(); }
方案二:同步实例修改到静态变量
如果必须每次新建实例,需要在Collection的ExecuteAsync方法中,将修改后的initialValueOffer同步回静态类的变量,确保下次新建实例时能传入更新后的值。
修改Collection类的ExecuteAsync方法:
public async Task ExecuteAsync() { // 原有代码 if (bestOfferInCollection != initialValueOffer) { if (/* 原有条件判断 */) { initialValueOffer = CalculateMyOfferNumber(2.5, 5, initialValueOffer); // 新增:将修改后的值同步到静态变量 OfferVariables.initialValueOfferFlowerLolitaCollections = initialValueOffer; // 原有后续代码 } } // 原有代码 }
内容的提问来源于stack exchange,提问作者paro
相关产品推荐
相关产品推荐

