0

Есть телеграм-бот с событием 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:38
  • Перенесите свой код из конструктора формы в обработчик события Form.Load. Никогда не вставляйте свой код в конструктор формы до тех пор, пока не узнаете, почему я вам это сказал. – aepot Jan 10 '21 at 11:57
  • 1
    @aepot спасибо! Сделал всё, как вы и посоветовали, заработало! – Papka Scallom Jan 10 '21 at 13:38
  • @aepot как я понял Action - это абстрактный класс, не имеющий параметров. А чем можно его заменить, чтобы можно было передать название метода, не имеющего параметров? – Papka Scallom Jan 11 '21 at 13:13
  • внутри лямбда-выражения можете писать что угодно, это просто блок кода, добавьте фигурные скобки только (() => { logList.Items.Add("Получено сообщение от пользователя: " + text); ... }) можете хоть любой метод оттуда вызвать, суть в том, что все что внутри, будет вызвано в UI потоке. – aepot Jan 11 '21 at 14:43

0 Answers0