2011-12-18 24 views
0

我正在寫一個IRC機器人,需要每隔幾分鐘就向該頻道做廣告。我用Timer做了一個嘗試,但它很雜亂,我無法將它粘貼到這裏,因爲它不可讀,我可以將整個文件的代碼發佈到pastebin。C#定時器和重複代碼

什麼需要被循環/定時以每5分鐘到信道發送:需要被髮送到信道,每10分鐘

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); 
} 

只是,一段代碼。任何幫助/指針將不勝感激。

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(); 
    } 
} 
+2

計時碼是更相關的比你所提供的代碼片斷的問題。無論如何,問題是什麼?你遇到什麼樣的問題? – Amy 2011-12-18 18:40:37

+0

使用定時器有什麼問題?你是否得到錯誤,鎖定或什麼? – Strillo 2011-12-18 18:48:57

+0

不,我不知道如何使用計時器每10分鐘發送一次該消息。 :/ – user1104783 2011-12-18 18:53:51

回答

1

您可以使用System.Windows.Threading命名空間的DispatcherTimer。 您可以參考MSDN Reference。根據您的要求設置此計時器的時間間隔,您可以在計時器滴答事件處理程序中編寫此代碼。希望這有助於

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); 
} 
0

您應該使用派遣定時器作爲@Aashish Thite已建議。

另外,這裏是你的問題:你定義

public static void ChannelAdvertise(object sender, IrcEventArgs e) 
{ 
} 

到收到兩個參數,但是你想不帶任何參數來調用它:

static void advertiseTimer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    ChannelAdvertise(); 
} 

這是你的錯誤消息「方法'ChannelAdvertise'沒有重載需要0個參數。「告訴你。

這麼說,你有兩個選擇:與需要2個參數來調用它(如您已定義的話),或者重新定義它,它不帶任何參數(如您從advertiseTimer_Elapsed方法調用它)

基本上,你需要傳入一個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) 
{ 
} 
+0

如何解決這個問題?因爲我需要public static void ChannelAdvertise(object sender,IrcEventArgs e )它需要IrcEventArgs e,以便我可以執行以下操作:irc.SendMessage(SendType.Message,e.Data.Channel,advertiseStream); 我該如何去做其他方式? – user1104783 2011-12-18 20:51:42

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