Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#计时器和重复代码_C#_Loops_Timer_Irc - Fatal编程技术网

C#计时器和重复代码

C#计时器和重复代码,c#,loops,timer,irc,C#,Loops,Timer,Irc,我正在写一个IRC机器人,它需要每隔几分钟向频道做一次广告。我尝试使用计时器,但它太乱了,我无法将它粘贴到这里,因为它无法读取,我可以将整个文件的代码发布到pastebin 每5分钟向频道发送需要循环/定时的内容: public static void ChannelAdvertise(object sender, IrcEventArgs e) { string advertiseStream = "Live right now: "; foreach (Monitor str

我正在写一个IRC机器人,它需要每隔几分钟向频道做一次广告。我尝试使用计时器,但它太乱了,我无法将它粘贴到这里,因为它无法读取,我可以将整个文件的代码发布到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();
    }
}

您可以使用System.Windows.Threading命名空间的Dispatchermer。 你可以参考。根据您的要求设置此计时器设置的间隔,您可以在timer tick事件处理程序中编写此代码。希望这有帮助

试试:

void Main()
{
    System.Threading.Timer timer = new System.Threading.Timer(
                                                   Callback, 
                                                   channel, 
                                                   0, 
                                                   10 * 60 * 1000);
}

void Callback(object state)
{
    ChannelAdvertise(this, (Channel)state);
}

您应该使用@Aashish Thite建议的调度计时器

此外,您的问题是:您定义

public static void ChannelAdvertise(object sender, IrcEventArgs e)
{
}
要接收两个参数,但您尝试在没有参数的情况下调用它:

static void advertiseTimer_Elapsed(object sender, ElapsedEventArgs e)
{
   ChannelAdvertise(); 
}
这就是您的错误消息“方法'ChannelAdvertise'的无重载接受0个参数”告诉您的

也就是说,您有两个选项:使用所需的2个参数调用它(如您所定义的),或者重新定义它,使其不接受任何参数(如您从
advertiestimer\u
方法调用它)

基本上,您需要传入一个sender对象和一个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 )
{
}

我最近写了一篇文章,可能正是你想要的。它在c#中演示了一个通用轮询组件,该组件以指定的间隔运行,并使用后台线程执行指定的用户操作

示例用法:

IPoller poller = new UrlPoller(args[0], TimeSpan.FromSeconds(7));
IPolling pollingComponent = new Polling.Core.Polling(poller);
pollingComponent.SubscribeForPollingUpdates(PollingAction);
pollingComponent.Start();
有关代码和完整示例,请参阅:


计时器代码比您提供的代码片段与问题更相关。无论如何,问题是什么?你有什么问题?使用计时器有什么问题?您是否收到错误、锁定或什么?不,我不知道如何使用计时器每10分钟发送一次该消息/我尝试的代码片段,但我得到“方法'ChannelAdvertise'的无重载”包含0个参数。我不知道如何执行此操作,但这是我的尝试:请将代码放入问题中,而不是放入pastebin。pastebin上的代码最终将(或可能,因此无法控制它)走开。我该如何解决这个问题?因为我需要公共静态void ChannelAdvertise(对象发送者,IrcEventArgs e)。它需要IrcEventArgs e以便我可以执行以下操作:irc.SendMessage(SendType.Message,e.Data.Channel,advertiseStream);我该如何以其他方式执行它?