2016-04-27 33 views
-1

我正在開發一個從頭開始的電報機器人,而不使用不是我的庫。我現在正在將我的庫轉換爲基於事件的庫,所以我不必硬編碼庫上的所有內容,也可以一起使用更多的庫。C#交叉線程事件未被觸發

到目前爲止,我有:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using TelegramSharp.Core; 
    using TelegramSharp.Core.Objects; 
    using System.Threading; 
    namespace Bot { 
     class Program { 
      static void Main(string[] args) { 
       BotSetup CFG = ConfigManager.LoadConfig("cfg.json"); 
       TelegramService TS = new TelegramService(CFG); 
       TS.Init();//instantiates all classes that telegramService uses. 
       TS.Parser.UpdateReceived += Parser_UpdateReceived;//this stays null. ??? 
       Thread Telegram = new Thread(TS.Start); 
       Telegram.Start(); 
      } 

      private static void Parser_UpdateReceived(object sender, UpdateReceivedEventArgs args) { 
       throw new NotImplementedException(); 
      } 
     } 
    } 

問題上標有意見,當我訂閱的事件,該事件保持空。而且我的NotImplementedException從不會引發。

我這是怎麼聲明的事件上MessageParserClass

public delegate void UpdateReceivedHandler(object sender, UpdateReceivedEventArgs args); 
    public event UpdateReceivedHandler UpdateReceived; 
    protected virtual void OnUpdateReceived(Message message, User bot) { 
     UpdateReceived?.Invoke(this, new UpdateReceivedEventArgs(message, bot)); 
    } 

這裏的事件引發

public void ParseMessage(Message msg, TelegramService bot) { 
     parsedMessagesCount++; 
     if (msg.Text != null /*&& msg.Date >= ToUnixTime(DateTime.UtcNow) - 10*/) { 
      OnUpdateReceived(msg, bot.BotIdentity); 
      OnTextMessageReceived(msg, bot.BotIdentity); 
     } 
    } 

這發生在所有我在這個項目中(所有聲明和使用聲明的事件一樣的方法)。發生這種情況是因爲Program類是靜態的(以及訂閱的方法)還是什麼?我如何解決併成功地提高事件?

+0

你能解釋一下'十字螺紋'的重要性嗎?在這段代碼中,事件處理程序將在'UpdateReceived'被調用的線程上運行。 – Gusdor

+1

樣式建議 - 而不是聲明和管理自己的委託類型,而是考慮使用'EventHandler '。它的代碼較少,並免費提供'EventArgs'模式。 – Gusdor

+0

@Gusdor我仍然在工作線程上調用事件,但事件應該在主線程上接收,這不是一個交叉線程事件嗎? 編輯:我試過,但沒有工作,所以我寫了最長的形式,並開始調試。 – Aironenero

回答

-1

我終於解決了這個問題。這與一個愚蠢的錯誤有關,here you clearly see why,basicalli我首先執行Init(),實例化我需要的所有類,然後我訂閱事件,然後我開始我的機器人,使用Start()(這是在早期版本的庫中創建的),裏面開始我重新創建類,所以我的事件將始終爲空。

無論如何,每個人都試圖幫助我。

+1

啊,舊的「發現代碼中的編程問題,我沒有顯示您」。爲了將來的參考,您可能想在尋找代碼問題的幫助時考慮創建[mcve]。這意味着您最終會向我們展示我們可以自行運行的代碼,並且實際展示您遇到的問題。 –

+0

感謝您的建議! – Aironenero