RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 727994
Accepted
Aleksey Brekhin
Aleksey Brekhin
Asked:2020-10-08 11:52:51 +0000 UTC2020-10-08 11:52:51 +0000 UTC 2020-10-08 11:52:51 +0000 UTC

使用异步的问题,等待

  • 772

你好论坛用户))我有一个问题:我写了一个电报机器人,它从照片中提取某些信息并将其输入数据库。进一步的代码,在 - 解释之后。

 private static async void BotOnPhotoReceived(object sender, MessageEventArgs messageEventArgs)
    {
        var message = messageEventArgs.Message;
        try
        {
            if (message == null || message.Type != MessageType.PhotoMessage)
                return;


            var fileId = message.Photo[message.Photo.Length - 1].FileId;

            var file = await Bot.GetFileAsync(fileId);

            var stream = file.FileStream;

            using (Stream output = new FileStream($"../../Photo/img{message.Chat.Id}{fileId}.jpg", FileMode.Append))
            {
                byte[] buffer = new byte[32 * 1024];
                int read;

                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    output.Write(buffer, 0, read);
                }
            }

            await Bot.SendChatActionAsync(message.Chat.Id, ChatAction.Typing);

            var FileUrl = @"D:\\128.png";
            using (var streamm = System.IO.File.Open(FileUrl, FileMode.Open))
            {
                FileToSend fts = new FileToSend();
                fts.Content = streamm;
                fts.Filename = FileUrl.Split('\\').Last();
                var test = await Bot.SendStickerAsync(message.Chat.Id, fts);
            }

            string imagePath = $"../../Photo/img{message.Chat.Id}{fileId}.jpg";

            TextDetection newTD = new TextDetection();

            string text = newTD.photo2string(imagePath);

            string result = ParseString(text);
            Console.WriteLine(Convert.ToDouble(result));
            double result1 = Math.Abs(Convert.ToDouble(result));

            DataBaseCon.InsertUser((int)message.Chat.Id, message.Chat.FirstName);
            DataBaseCon.InsertAmount((int)message.Chat.Id, result1);

            var keyboard = new Telegram.Bot.Types.ReplyMarkups.InlineKeyboardMarkup();
            keyboard.InlineKeyboard = new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[][]
            {
                new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[]
                {
                    new KeyboardButton("Продукты питания"),
                    new KeyboardButton("Техника"),
                },
                new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[]
                {
                    new KeyboardButton("Транспорт"),
                    new KeyboardButton("Мобильная связь")
                },
                new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[]
                {
                    new KeyboardButton("Другое")
                },
            };

            await Bot.SendTextMessageAsync(message.Chat.Id, "Выберите категорию товара, который вы приобрели", replyMarkup: keyboard);


            await Task.Delay(1000);

            bool flag = true;

            Bot.OnCallbackQuery += (object sc, CallbackQueryEventArgs ev) =>
            {
                Task.Delay(5000);
                if (ev.CallbackQuery.Data == "Транспорт" && flag)
                {
                    DataBaseCon.InsertCategory((int)message.Chat.Id, "Транспорт");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на транспорт зафиксированы");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
                }
                else
                if (ev.CallbackQuery.Data == "Мобильная связь" && flag)
                {
                    DataBaseCon.InsertCategory((int)message.Chat.Id, "Мобильная связь");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на мобильную связь зафиксированы");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
                }
                else
                if (ev.CallbackQuery.Data == "Продукты питания" && flag)
                {
                    DataBaseCon.InsertCategory((int)message.Chat.Id, "Продукты питания");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на продукты питания зафиксированы");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);

                }
                else
                if (ev.CallbackQuery.Data == "Техника" && flag)
                {
                    DataBaseCon.InsertCategory((int)message.Chat.Id, "Техника");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на технику зафиксированы");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
                }
                else
                if (ev.CallbackQuery.Data == "Другое" && flag)
                {
                    DataBaseCon.InsertCategory((int)message.Chat.Id, "Другое");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на другую категорию зафиксированы");
                    Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
                }
                flag = !flag;
            };

            if (flag)
            {  
                await Bot.SendTextMessageAsync(message.Chat.Id, WalletKeeper.Constants.IT_IS_DONE);
            }

        }
        catch (Exception e){
            await Bot.SendTextMessageAsync(message.Chat.Id, WalletKeeper.Constants.FAILED);            
        }
    }

如您所见,我在这里使用了按钮,但它们(或者更确切地说,它们的处理)存在问题。我上传了一张照片,然后我选择了将数据添加到(在数据库中)“交通”、“移动通信”等的类别,我遇到了以下问题:假设我第一次上传照片并选择了一个类别- 一切都很好,第二次 - 信息也输入正确,第三次我两次将一些数据输入数据库,我已经打破了我的整个脑袋(还有调试器),但是这个bug一直没有成立。据推测,问题是由于不正确使用async 和 await造成的。以防万一,我会发布更多代码。

        static void Main(string[] args)
    {
        Bot.OnMessage += BotOnMessageReceived;
        Bot.OnMessage += BotOnPhotoReceived;

        var me = Bot.GetMeAsync().Result;
        Console.Title = me.Username;

        Bot.StartReceiving();
        Console.ReadLine();
        Bot.StopReceiving();
    }

提前致谢))

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    player one
    2020-10-08T17:12:03Z2020-10-08T17:12:03Z

    您的错误是在BotOnPhotoReceived您重新订阅的处理程序内部OnCallbackQuery。因此,随着每个新接收到的图片,OnCallbackQuery越来越多的相同处理程序被挂断在事件上。当一个事件发生时,它们都会依次触发。

    只需将这部分代码从BotOnPhotoReceived.

    Bot.OnCallbackQuery += (object sc, CallbackQueryEventArgs ev) =>
    {
        //...
    }
    

    执行与订阅BotOnMessageReceived和相同的操作BotOnPhotoReceived。也就是说,将 lambda 表达式中的所有代码放入一个常规方法中,并在程序开始时为其订阅一次事件。在方法BotOnPhotoReceived中,根本不要触摸Bot.OnCallbackQuery(从那里删除所有引用)。这是它应该是什么样子的大致视图:

    static void Main(string[] args)
    {
        // ...
        Bot.OnCallbackQuery += BotOnCallbackQuery;
        // ...
    }
    
    private static void BotOnCallbackQuery(object sender, CallbackQueryEventArgs ev)
    {
        if (ev.CallbackQuery.Data == "Транспорт")
        {
            DataBaseCon.InsertCategory((int)message.Chat.Id, "Транспорт");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на транспорт зафиксированы");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
        }
        else if (ev.CallbackQuery.Data == "Мобильная связь")
        {
            DataBaseCon.InsertCategory((int)message.Chat.Id, "Мобильная связь");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на мобильную связь зафиксированы");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
        }
        else if (ev.CallbackQuery.Data == "Продукты питания")
        {
            DataBaseCon.InsertCategory((int)message.Chat.Id, "Продукты питания");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на продукты питания зафиксированы");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
        }
        else if (ev.CallbackQuery.Data == "Техника")
        {
            DataBaseCon.InsertCategory((int)message.Chat.Id, "Техника");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на технику зафиксированы");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
        }
        else if (ev.CallbackQuery.Data == "Другое")
        {
            DataBaseCon.InsertCategory((int)message.Chat.Id, "Другое");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на другую категорию зафиксированы");
            Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
        }
    }
    

    (这不是一个现成的解决方案,而只是一个示例。如您所见,我从代码中删除了变量,flag因为我不明白它为您服务。)

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5