我正在开发一个应用程序,它会在一分钟内显示一个随机电影引用,但我无法让代码工作。
我正在使用一个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));
}
}
答案 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