计时器回调委托不会在每次运行时从参数中获得刷新的值

本文关键字:参数 刷新 运行时 回调 计时器 | 更新日期: 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的更新值,然后在回调中调用该方法。