2016-04-27 16 views
-1

Ich entwickle ein Telegramm Bot von Grund auf neu, ohne Bibliotheken zu verwenden, die nicht mir gehören. Ich konvertiere jetzt meine Bibliothek, um ereignisbasiert zu sein, also muss ich nicht alles in der Bibliothek selbst fest codieren und ich kann mit mehreren Bibliotheken zusammen arbeiten.C# Kreuzthread-Ereignis nicht ausgelöst

Bisher habe ich:

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

das Problem auf den Kommentaren markiert ist, wenn ich auf das Ereignis abonnieren, bleibt das Ereignis null. Und meine NotImplementedException wird nie ausgelöst.

dies ist, wie ich das Ereignis auf MessageParserClass erklärt

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

und hier wird das Ereignis

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

Diese Ereignisse für alle geschieht i in diesem Projekt erklärt (alle deklariert und verwendet in in der gleichen Weise). Ist dies der Fall, weil die Program-Klasse statisch ist (und die Methode, die auch abonniert) oder was? Wie kann ich die Ereignisse beheben und erfolgreich auslösen?

+0

Können Sie hier die Bedeutung von "Querfaden" erklären? In diesem Code wird der Event-Handler auf dem Thread ausgeführt, von dem 'UpdateReceived' aufgerufen wird. – Gusdor

+1

Style-Hinweis - Anstatt den eigenen Delegate-Typ zu deklarieren und zu managen, sollten Sie stattdessen "EventHandler " verwenden. Es ist weniger Code und gibt Ihnen das 'EventArgs' Muster kostenlos. – Gusdor

+0

@Gusdor Ich rufe immer noch das Ereignis auf Working-Thread, aber Event sollte auf dem Haupt-Thread empfangen werden, ist dies nicht ein Cross-Thread-Ereignis? Edit: Ich habe das zuerst versucht, aber hat nicht funktioniert, also schrieb ich das längste Formular und begann mit dem Debuggen. – Aironenero

Antwort

-1

Ich habe dieses Problem endlich gelöst. Es wurde mit einem dummen Fehler in Verbindung gebracht, here you clearly see why, basicalli ich führe zuerst Init() aus, instanziierend alle Klassen, die ich brauche, dann abonniere ich das Ereignis und später starte ich meinen Bot mit Start() (das wurde in einer früheren Version der Bibliothek gemacht), ich starte die Klassen neu, also wäre mein Event immer null gewesen.

Danke sowieso an alle versucht, mir zu helfen.

+1

Ah, das alte "finde das Programmierproblem im Code, den ich nicht zeige Sie". Zukünftig möchten Sie möglicherweise nach einem [mcve] suchen, wenn Sie nach Hilfe bei Codeproblemen suchen. Es bedeutet, dass Sie uns Code zeigen, den wir selbst ausführen können, und zeigen das Problem, das Sie sehen. –

+0

Danke für den Hinweis! – Aironenero