代码的作用是循环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
我看不到问题所在,我知道我正在寻找某些东西,但是我不确定是什么,朝着正确方向的任何帮助将不胜感激。
答案 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()) );
希望有帮助!