Есть телеграм-бот с событием OnMessage. На форме находится logList типа ListBox, куда я хочу записывать некоторый лог из телеграма. Так как OnMessage событие асинхронное, я не могу никак понять как изменить элемент управления или хотя бы передать данные куда-нибудь чтобы можно было изменить список.
public Main()
{
InitializeComponent();
botClient = new TelegramBotClient("token");
var bot = botClient.GetMeAsync().Result;
botClient.OnMessage += BotClient_OnMessage;
botClient.StartReceiving();
logList.Items.Add("Бот начал приём сообщений.");
}
private static async void BotClient_OnMessage(object sender, MessageEventArgs e)
{
var text = e?.Message?.Text;
string answer;
if (text == null)
return;
// здесь добавить запись
//logList.Items.Add("Получено сообщение от пользователя: " + text);
if (text == "/screen")
{
answer = "Отправка скриншота...";
await botClient.SendTextMessageAsync(chatId: e.Message.Chat, answer).ConfigureAwait(false);
var bitmap = new Bitmap(1920, 1080, PixelFormat.Format32bppArgb);
Rectangle captureRectangle = Screen.AllScreens[0].Bounds;
Graphics graphics = Graphics.FromImage(bitmap);
graphics.CopyFromScreen(captureRectangle.Left, captureRectangle.Top, 0, 0, captureRectangle.Size);
bitmap.Save(screenSavingPath, ImageFormat.Jpeg);
var fileStream = new FileStream(screenSavingPath, FileMode.Open, FileAccess.Read, FileShare.Read);
await botClient.SendPhotoAsync(chatId: e.Message.Chat, photo: new InputOnlineFile(fileStream)).ConfigureAwait(false);
fileStream.Close();
File.Delete(screenSavingPath);
}
}
this.Invoke((Action)(() => logList.Items.Add("Получено сообщение от пользователя: " + text)));– aepot Jan 10 '21 at 11:38Form.Load. Никогда не вставляйте свой код в конструктор формы до тех пор, пока не узнаете, почему я вам это сказал. – aepot Jan 10 '21 at 11:57(() => { logList.Items.Add("Получено сообщение от пользователя: " + text); ... })можете хоть любой метод оттуда вызвать, суть в том, что все что внутри, будет вызвано в UI потоке. – aepot Jan 11 '21 at 14:43