【问题标题】:Generating a random quote from list every minute每分钟从列表中生成一个随机报价
【发布时间】:2012-03-08 21:42:11
【问题描述】:

我正在开发一个每分钟显示一次随机电影报价的应用程序,但我无法让代码工作。

我正在使用一个包含标签的 UserControl 来显示报价,并且我想在它的 Page_Load 中实例化“报价”。构造函数启动一个计时器,该计时器每分钟调用一次随机引用的函数,并将其返回给 Page_Load 并在 Label.Text 中显示。

带有计时器的行给了我以下错误消息:“System.Timers.Timer”不包含接受 4 个参数的构造函数,这对我来说没有意义吗?

public class Quote {
    List<string> movieQuote;

    private string RandomQuote(object state) {

        movieQuote.Add("quote1");
        movieQuote.Add("quote2");
        movieQuote.Add("quote3");
        movieQuote.Add("quote");

        Random randNr = new Random();
        int aRandomPos = randNr.Next(1, movieQuote.Count);

        string quote = movieQuote[aRandomPos];

        return quote;
    }

    public Quote() {
         movieQuote = new List<string>();
         Timer timer = new Timer(RandomQuote, null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
    }
}

【问题讨论】:

  • 您的Timer 问题不谈,您当前的代码永远不会选择第一个引号。
  • 您的代码有几个问题(除了提出的问题)。您应该在构造函数中初始化一个Random,并使用单个实例。您应该在构造函数中填写movieQuote,之后不要修改它。您应该生成一个从 0 到计数的随机数,而不是从 1 到计数。您有很多一次性使用的局部变量,消除这些可能会将您的 RandomQuote 方法放到一行中(尽管在多行中它可能更具可读性,您自己决定)。 RandomQuote 应该返回 void 并修改状态,因为任何返回值都会丢失。
  • @Anthony:嗯,这不是第一次,而且在随后的调用中发生的机会比其他调用要小。

标签: c# asp.net random timer


【解决方案1】:

您应该使用using System.Threading 而不是System.Timers

【讨论】:

  • 我实际上同时使用了“System.Threading”和“System.Timers”(如果我删除“System.Timers”,则无法识别“Timer”方法。
【解决方案2】:

首先,您需要了解 .NET 中内置了几个不同的 Timer 类,它们的行为略有不同,具体取决于特定库中计时器用户的最可能需求。 System.Timers.Timer 确实没有带有四个参数的构造函数。您可能想要的是 System.Threading.Timer。

另外,我应该告诉你,Web 环境中的计时器很糟糕。糟糕,糟糕,糟糕。原因是因为 ASP.NET 生命周期。简而言之,你的代码隐藏类的实例只存在于内存中,只要它需要呈现 HTML 页面。之后,它被释放并被 GCed。当一个新的请求进来时,对于一个表单事件或其他什么,一个新的类实例被创建。结果是在 Page_Load 期间创建的 Timer 将超出范围并在触发 Tick 事件之前很久就被处理掉。

相反,您需要的是页面的 AJAX-y 区域,该区域使用 Javascript 超时来触发对服务器的调用,该调用将生成新的随机报价。这将以 XML 格式返回给客户端,客户端可以将其写入页面的 DOM,而无需完整的回发。您可以将 AJAX 互操作控件添加到您的页面以简化此操作(它将触发完整的回发,但实际上只会重绘由 AJAX UpdatePanel 界定的区域),或者您可以为您的页面提供一个简单的 SOAP 或 JSON 服务调用,它将无需运行任何其他服务器端逻辑即可返回字符串。

【讨论】:

  • 感谢您为我解释这一点。我会去找你的解决方案。
【解决方案3】:

错误信息说明了一切。

System.Timers.Timer 没有接受 4 个参数的构造函数。您应该使用System.Threading.Timer。可能您需要的解决方法是更改​​:

using System.Timers;

using System.Threading;

【讨论】:

    【解决方案4】:

    您使用的计时器没有接受 4 个参数的构造函数:

    http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

    它只有两个构造函数,每个都不接受4个参数。

    正如其他人指出的,您需要使用接受 4 个参数的不同计时器:

    http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多