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

时间:2020-05-29 08:34:13

标签: c# async-await

代码的作用是循环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;
        }

我得到的错误是: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 个答案:

答案 0 :(得分:5)

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

希望有帮助!

相关问题