我正在開發一個從頭開始的電報機器人,而不使用不是我的庫。我現在正在將我的庫轉換爲基於事件的庫,所以我不必硬編碼庫上的所有內容,也可以一起使用更多的庫。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類是靜態的(以及訂閱的方法)還是什麼?我如何解決併成功地提高事件?
你能解釋一下'十字螺紋'的重要性嗎?在這段代碼中,事件處理程序將在'UpdateReceived'被調用的線程上運行。 – Gusdor
樣式建議 - 而不是聲明和管理自己的委託類型,而是考慮使用'EventHandler'。它的代碼較少,並免費提供'EventArgs'模式。 –
Gusdor
@Gusdor我仍然在工作線程上調用事件,但事件應該在主線程上接收,這不是一個交叉線程事件嗎? 編輯:我試過,但沒有工作,所以我寫了最長的形式,並開始調試。 – Aironenero