Таймеры C # и повторяющийся код - PullRequest
0 голосов
/ 18 декабря 2011

Я пишу 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();
    }
}

Ответы [ 4 ]

1 голос
/ 18 декабря 2011

Вы можете использовать DispatcherTimer пространства имен System.Windows.Threading.Вы можете обратиться к MSDN Reference .Установите интервал этого таймера в соответствии с вашими требованиями, и вы можете написать этот код в обработчике событий таймера.Надеюсь, это поможет

0 голосов
/ 14 сентября 2012

Я недавно написал статью, которая может быть именно тем, что вы ищете. Он демонстрирует в 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

0 голосов
/ 19 декабря 2011

Вы должны использовать Таймер отправки, как предложил @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 )
{
}
0 голосов
/ 18 декабря 2011

Попробуйте:

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

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