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

C# 每分钟从列表生成一个随机引用,c#,asp.net,random,timer,C#,Asp.net,Random,Timer,我正在开发一个每分钟显示一次随机电影引用的应用程序,但我无法让代码正常工作 我正在使用一个包含一个标签的UserControl来显示quote,在它的页面加载中,我想实例化“quote”。构造函数启动一个计时器,该计时器调用函数,该函数每分钟随机引用一次,然后将其返回到页面加载并在Label.Text中显示 带计时器的行给了我以下错误消息:“System.Timers.timer”不包含接受4个参数的构造函数,这对我来说毫无意义 public class Quote { List<

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

我正在使用一个包含一个标签的UserControl来显示quote,在它的页面加载中,我想实例化“quote”。构造函数启动一个计时器,该计时器调用函数,该函数每分钟随机引用一次,然后将其返回到页面加载并在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));
    }
}
公共类报价{
列出电影报价;
私有字符串随机引用(对象状态){
电影报价。添加(“报价1”);
电影报价。添加(“报价2”);
电影报价。添加(“报价3”);
电影报价。添加(“报价”);
Random randNr=新的Random();
int aRandomPos=randNr.Next(1,movieQuote.Count);
字符串quote=movieQuote[aRandomPos];
返回报价;
}
公开报价(){
movieQuote=新列表();
Timer Timer=新计时器(RandomQuote,null,TimeSpan.Zero,TimeSpan.FromMinutes(1));
}
}

您应该使用
使用System.Threading
而不是
System.Timers
您使用的计时器没有接受4个参数的构造函数:

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

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


错误消息说明了一切

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

using System.Timers;


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

另外,我应该告诉你,网络环境中的计时器很糟糕。糟糕,糟糕,糟糕。原因在于ASP.NET生命周期。它的缺点是,codebehind类的实例只在内存中存在一段时间,直到呈现HTML页面为止。在那之后,它被发布和GCed。当一个新的请求进入时,对于一个表单事件或者其他什么,一个新的类实例被创建。结果是,在页面加载期间创建的计时器将超出作用域,并在触发勾号事件之前很久被处理掉


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

除了您的
计时器问题之外,您当前的代码永远不会选择第一个引号。您的代码有几个问题(除了被询问的问题)。您应该在构造函数中初始化一个
Random
,并使用单个实例。您应该在构造函数中填写
movieQuote
,以后不要修改它。您应该生成从0到计数的随机数,而不是从1到计数的随机数。您有很多单用局部变量,消除这些变量可能会将
RandomQuote
方法放到一行中(尽管您决定在多行中它可能更可读)
RandomQuote
应该返回
void
并修改状态,因为任何返回值都会丢失。@Anthony:这不是第一次,而且在后续调用中发生的几率也会比其他调用小。我实际上同时使用了“System.Threading”和“System.Timers”(如果我删除“System.Timers”方法“Timer”无法识别。谢谢你为我解释。我会为你的解决方案。
using System.Threading;