每分钟从列表中生成一个随机引用

时间:2012-03-08 21:42:11

标签: c# asp.net random timer

我正在开发一个应用程序,它会在一分钟内显示一个随机电影引用,但我无法让代码工作。

我正在使用一个UserControl,其中包含一个标签来显示引号,并在其中Page_Load我想实例化“Quote”。构造函数启动一个计时器,该计时器调用一分钟随机化一次引用的函数,并将其返回到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));
    }
}

4 个答案:

答案 0 :(得分:3)

您应该使用using System.Threading代替System.Timers

答案 1 :(得分:2)

错误消息说明了一切。

System.Timers.Timer没有带4个参数的构造函数。您应该使用System.Threading.Timer。你可能需要修改的是:

using System.Timers;

using System.Threading;

答案 2 :(得分:2)

首先,您需要了解.NET中内置了一些不同的Timer类,根据特定库中定时器用户的最可能要求,行为略有不同。 System.Timers.Timer确实没有带有四个参数的构造函数。您可能想要的是System.Threading.Timer。

另外,我应该告诉你,网络环境中的计时器很糟糕。坏,坏,坏。之所以是因为ASP.NET生命周期。缺点是代码隐藏类的实例只存在于内存中,只要它呈现HTML页面即可。之后,它被释放并且GCed。当新请求进入时,对于表单事件或其他任何内容,将创建该类的新实例。结果是在Page_Load期间创建的Timer将超出范围,并在触发Tick事件之前被处理掉。

相反,你想要的是你的页面的AJAX-y区域,它使用Javascript Timeout来触发对服务器的调用,这将生成一个新的随机引用。这将以XML格式返回给客户端,客户端可以将其写入页面的DOM,而不需要完整的回发。有一些AJAX互操作控件你可以添加到你的页面来简化它(它将触发一个完整的回发,但实际上只重绘了由AJAX UpdatePanel限制的区域),或者你可以给你的页面一个简单的SOAP或JSON服务调用,返回字符串,而不必运行任何其他服务器端逻辑。

答案 3 :(得分:0)

您正在使用的计时器没有接受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