异步/等待任务没有返回值

3

这段代码循环遍历一个URL的数据表格,检查HTML中是否包含特定字符串,并根据情况返回数据,目前非常基础。

我正在尝试更好地理解await/async方法,到目前为止我已经有了相当不错的掌握程度,但是我遇到了一个问题,我目前的代码如下:

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;
        }

我遇到的错误是: 无法将类型 'void' 转换为 'object',出错代码在这一行: row.Cells[2].Value = await Task.Run(() => { Helpers.GetLinkPlatformType(row.Cells[0].Value.ToString()); }); 上方还提示了: 等待的任务没有返回值,但是 GetLinkPlatformType 方法确实有返回一个值,它不是 void 类型。我不知道问题出在哪里,我知道我可能忽略了什么,但具体是什么我不确定。如果能给予任何帮助或指引,将不胜感激。

1
你的 GetLinkPlatformType 方法也不是异步的,所以没有必要使用 Task.Run(..) 来执行它。这也意味着所有的代码都是同步的,在这个示例代码中任何地方都不需要使用 async/await。 - Thomas Schmidt
1个回答

7
问题在于你的任务没有返回任何内容,你漏掉了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()) );

希望有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接