2016-04-27 4 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(); 
      } 
     } 
    } 

問題は、私がイベントをサブスクライブするとき、イベントがnullのまま、コメントにマークされています。私の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); 
     } 
    } 

を上げている。これは私がこのプロジェクトで宣言されたすべてのイベント(すべてが宣言され、中で使用さはどうなります同じ方法)。これは起こっているのは、プログラムクラスが静的である(そしてそれも購読するメソッド)か、何ですか?私はどのように修正し、成功裏にイベントを上げることができますか?

+0

「クロススレッド」の重要性をここで説明できますか?このコードでは、イベントハンドラは 'UpdateReceived'が呼び出されたスレッド上で実行されます。 – Gusdor

+1

スタイルのアドバイス - 独自のデリゲート型を宣言して管理するのではなく、代わりに 'EventHandler 'の使用を検討してください。コードが少なくて、 'EventArgs'パターンを無料で提供します。 – Gusdor

+0

@ Gusdor私はまだ動作中のスレッドでイベントを呼び出していますが、イベントはメインスレッドで受信する必要があります。これはクロススレッドイベントではありませんか? 編集:まず試しましたが、動作していないので、最も長いフォームを書き、デバッグを開始しました。 – Aironenero

答えて

-1

私はついにこの問題を解決しました。それは愚かな間違いに関連していたhere you clearly see why、basicalli私は最初にInit()を実行し、必要なすべてのクラスをインスタンス化し、その後、イベントに登録し、後で私はロボットの前のバージョンで作られたStart()を使ってボットを開始します)、私はクラスを再作成するので、私のイベントは常にnullになっていた。

誰もが私を助けてくれたことに感謝します。

+1

ああ、古い "君は"。将来的には、コードの問題に関するヘルプを探すときに[mcve]を作成することを検討することをお勧めします。それは、あなたが私たちが自分自身を走らせることができ、実際にあなたが見ている問題を示しているコードを私たちに示してしまうことを意味します。 –

+0

アドバイスをいただきありがとうございます! – Aironenero

関連する問題