我正在编写一个IRC机器人,需要每隔几分钟向频道播放一些内容。我尝试使用Timer,但它太乱了,我不能把它粘贴在这里因为它不可读,我可以将整个文件的代码发布到pastebin。
需要循环播放/定时每5分钟发送一次到频道:
public static void ChannelAdvertise(object sender, IrcEventArgs e)
{
string advertiseStream = "Live right now: ";
foreach (Monitor stream in streams)
{
if (stream.streamOnline)
{
advertiseStream += (char)3 + "03" + stream.nick +
(char)15 + " - " + stream.weblink() + " ";
}
}
irc.SendMessage(SendType.Message, e.Data.Channel,
advertiseString);
}
这段代码需要每10分钟发送一次。任何帮助/指针将不胜感激。
class Bot
{
private static System.Timers.Timer advertiseTimer;
static void Main(string[] args)
{
advertiseTimer = new System.Timers.Timer(60000);
advertiseTimer.Elapsed += new ElapsedEventHandler(advertiseTimer_Elapsed);
advertiseTimer.Start();
}
public static void ChannelAdvertise(object sender, IrcEventArgs e)
{
string advertiseStream = "Live right now :";
foreach (Monitor stream in streams)
{
if (stream.streamOnline)
{
advertiseStream += (char)3 + "03" + stream.nick + (char)15 + " - " + stream.weblink() + " ";
}
irc.SendMessage(SendType.Message, e.Data.Channel, advertiseStream);
}
}
static void advertiseTimer_Elapsed(object sender, ElapsedEventArgs e)
{
ChannelAdvertise();
}
}
答案 0 :(得分:1)
您可以使用System.Windows.Threading命名空间的DispatcherTimer。 您可以参考MSDN Reference。根据您的要求设置此计时器的时间间隔,您可以在timer tick事件处理程序中编写此代码。希望这有帮助
答案 1 :(得分:0)
尝试:
void Main()
{
System.Threading.Timer timer = new System.Threading.Timer(
Callback,
channel,
0,
10 * 60 * 1000);
}
void Callback(object state)
{
ChannelAdvertise(this, (Channel)state);
}
答案 2 :(得分:0)
您应该使用Dispatch Timer作为@Aashish Thite建议。
另外,这是你的问题:你定义
public static void ChannelAdvertise(object sender, IrcEventArgs e)
{
}
收到两个参数,但是你试图在没有参数的情况下调用它:
static void advertiseTimer_Elapsed(object sender, ElapsedEventArgs e)
{
ChannelAdvertise();
}
这是您的错误消息"方法' ChannelAdvertise'取0个参数。"告诉你。
说,你有两个选择:用必需的2个参数调用它(正如你已经定义的那样),或者重新定义它以便它不带任何参数(因为你从advertiseTimer_Elapsed
调用它方法)
基本上,您需要传入发送方对象和IrcEventArgs参数。 所以,你可以这样称呼它:
static void advertiseTimer_Elapsed(object sender, ElapsedEventArgs e)
{
// make a new one, or get it form some collection, or whatever
IrcEventArgs args = new IrcEventArgs( /* initialize the object */ );
ChannelAdvertise(this,args);
}
或者您可以像这样重新定义:
//查看您的代码,您只使用IrcEventArgs.Data
对象
public static void ChannelAdvertise( channelobject channel )
{
}
答案 3 :(得分:0)
我最近写了一篇文章,可能就是你想要的。它在c#中演示了一个通用的轮询组件,它以指定的时间间隔运行,并使用后台线程来执行指定的用户操作。
样本用法:
IPoller poller = new UrlPoller(args[0], TimeSpan.FromSeconds(7));
IPolling pollingComponent = new Polling.Core.Polling(poller);
pollingComponent.SubscribeForPollingUpdates(PollingAction);
pollingComponent.Start();
有关代码和完整示例,请参阅: