Asyn c / Await Task не возвращает значения - PullRequest
2 голосов
/ 29 мая 2020

Код выполняет циклическую проверку таблицы данных URL-адресов в html для определенной строки и, соответственно, возвращает данные, очень базовые c пока.

Я пытаюсь понять ожидание / asyn c методы лучше, у меня пока довольно хорошо gr asp, но я наткнулся на загвоздку, код, который у меня есть:

FormMain.cs

        public async Task RunAsyncAnalyzer()
        {
            try
            {
                BtnPerformLinkAnalysis.Enabled = false;
                if (DataGridViewLinks.Rows.Count > 0)
                {
                    foreach (DataGridViewRow row in DataGridViewLinks.Rows)
                    {
                        row.Cells[2].Value = await Task.Run(() => { Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()); });
                    }
                }
                BtnPerformLinkAnalysis.Enabled = true;
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging("[" + DateTime.Now + "]-[" + ex.ToString() + "]");
            }

        }

        private async void BtnPerformLinkAnalysis_Click(object sender, EventArgs e)
        {
            await RunAsyncAnalyzer();
        }

Helpers.cs

        public static string GetLinkPlatformType(string url) {
            string platform_type = "......";
            try { 
                var html = GetWebPageHTML(url);

                if (html.Contains("Start the discussion…")) {
                    platform_type = "DISCUZ|CAN_COMMENT";
                }
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging("[" + DateTime.Now + "]-[" + ex.ToString() + "]");
            }
            return platform_type;
        }

Я получаю следующую ошибку: cannot convert type 'void' to 'object', и она находится в этой строке: row.Cells[2].Value = await Task.Run(() => { Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()); });

Здесь также сказано: Awaited Task returns no value, но метод GetLinkPlatformType действительно возвращает значение, это не void я не вижу, в чем проблема, я знаю, что я что-то не смотрю, но я не совсем уверен, что, будет приветствоваться любая помощь в правильном направлении.

1 Ответ

5 голосов
/ 29 мая 2020

Проблема в том, что ваша задача ничего не возвращает, вы пропустили return.

row.Cells[2].Value = await Task.Run(() => { return Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()); });

В противном случае это просто задача, которая что-то делает, но ничего не возвращает.

Кроме того, как @leszek упомянул в комментариях, вот еще один подход:

row.Cells[2].Value = await Task.Run(() => Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()) );

Надеюсь, это поможет!

...