计时器回调委托不会在每次运行时从参数中获得刷新的值
本文关键字:参数 刷新 运行时 回调 计时器 | 更新日期: 2023-09-27 18:08:25
我现在有以下代码。它正在工作,但picturesDownloaded
没有更新。在这5秒内,sendData没有被调用,picturesDownloaded
获得另一个值。如何刷新它每次定时器运行?所以obj.ToString()
将是正确的值。
在某一点上picturesDownloaded
的值为"11",但object obj
的值仍为"0"。
public static volatile string picturesDownloaded = "0";
System.Threading.Timer timer = new System.Threading.Timer(sendData, picturesDownloaded, 1000 * 5, 1000 * 5);
public static void sendData(object obj)
{
WebClient wc = new WebClient();
string imageCountJson = wc.DownloadString("http://******/u.php?count=" + obj.ToString());
}
试试这个:
public static volatile string picturesDownloaded = "0";
System.Threading.Timer timer = new System.Threading.Timer(sendData, new Func<string>(() => picturesDownloaded), 1000 * 5, 1000 * 5);
public static void sendData(object obj)
{
var value = ((Func<string>)obj)();
WebClient wc = new WebClient();
string imageCountJson = wc.DownloadString("http://******/u.php?count=" + value);
}
问题在于,当您创建计时器时,您向构造函数传递了对字符串"0"
的引用。当你更新picturesDownloaded
的值时,它不会改变传递给Timer
构造函数的对象的值。
这可以通过向Timer
构造函数提供一个匿名方法来纠正,该方法可以检索picturesDownloaded
的更新值,然后在回调中调用该方法。