私は私のものではないライブラリを使用せずに、最初から電報ボットを開発しています。私は今、私のライブラリをイベントベースに変換しているので、ライブラリ自体のすべてをハードコードする必要はなく、より多くのライブラリを一緒に使うことができます。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);
}
}
を上げている。これは私がこのプロジェクトで宣言されたすべてのイベント(すべてが宣言され、中で使用さはどうなります同じ方法)。これは起こっているのは、プログラムクラスが静的である(そしてそれも購読するメソッド)か、何ですか?私はどのように修正し、成功裏にイベントを上げることができますか?
「クロススレッド」の重要性をここで説明できますか?このコードでは、イベントハンドラは 'UpdateReceived'が呼び出されたスレッド上で実行されます。 – Gusdor
スタイルのアドバイス - 独自のデリゲート型を宣言して管理するのではなく、代わりに 'EventHandler'の使用を検討してください。コードが少なくて、 'EventArgs'パターンを無料で提供します。 –
Gusdor
@ Gusdor私はまだ動作中のスレッドでイベントを呼び出していますが、イベントはメインスレッドで受信する必要があります。これはクロススレッドイベントではありませんか? 編集:まず試しましたが、動作していないので、最も長いフォームを書き、デバッグを開始しました。 – Aironenero