C#定时器和重复代码

时间:2011-12-18 18:35:30

标签: c# loops timer irc

我正在编写一个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();
    }
}

4 个答案:

答案 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();

有关代码和完整示例,请参阅:

http://www.avantprime.com/blog/24/an-example-of-repeating-code-using-a-worker-thread-without-using-timers-c