如何从事件处理程序调用异步方法?



我是一个完全的初学者async/await,所以任何帮助将是伟大的。

async Task<bool> IsIPBannedAsync(string ip)
{
try
{
bool isBanned = false;
await foreach (var line in File.ReadLinesAsync(BannedIPFile))
{
if(line.Contains(ip.Trim())) { isBanned = true; break; }
}
return isBanned;
}
catch { return false; }
}

我从一个按钮调用它,将结果发送给一个标签:

private void btnCheck_Click(object sender, EventArgs e)
{
lblResult.Text = string.Empty;
lblResult.Text = IsIPBannedAsync(txtIP.Text);
}

当然,我曾尝试使用Convert.ToBoolean()|Convert.ToString()发送结果,但没有成功,并获得System.Threading字符串,而不是布尔值true | false。

没有async,我可以让事情工作:

bool isBanned = false;
isBanned = File.ReadLines(BannedIPFile).Contains(ip.Trim());
return isBanned;

谁能告诉我我做错了什么,拜托?Appreciate it - thank you

更新:

那些找不到我发布的内容的人,可以在这里看到。我使用的是net core 7.0,它是在该版本中引入的。

在Button Click事件中,它不喜欢返回布尔值,并要求将其转换为字符串。并非所有微软解决方案都有效。

如果我将Task<bool>更改为Task<string>,然后在任何地方使用返回IsBanned.ToString();

@ProgrammingLlama,我从第3版开始使用VB,参加了微软的大部分。net发布,但从2010年左右开始,我就根本没有真正为编码而烦恼,但我仍然每年为MSDN企业订阅付费,作为一个人。

我的VS版本:

Microsoft Visual Studio Enterprise 2022(64位)-当前版本17.5.4

我对VS2022开发者社区的一些问题在这个网站和MSDN网站上被引用了很多次。

ReadAllLinesAsync注释是正确的,因为如果答案在第1行,为什么要一直读一个文件?

EDIT/UPDATE 2:

Liam,这是c#, Net Core 7桌面应用程序,它将被放入DLL并在我朋友的net core 7.0 razor上使用的网站。我几乎每天都会用到这个

感谢大家的发帖,我还需要解决这个问题。

大家好,感谢大家的建议。我发现它和点击事件一样简单。

简而言之:

private async void btnCheck_Click(object sender, EventArgs e)
{
bool IsBanned = await IsIPBannedAsync(txtIP.Text);
lblResult.Text = IsBanned.ToString();
}
public async Task<bool> IsIPBannedAsync(string ip)
{
try
{
bool IsBanned = false;
await foreach (var line in File.ReadLinesAsync(IPFileList))
{
if (line.Contains(ip.Trim())) { IsBanned = true; break; }
}
return IsBanned;
}
catch { return false; } // This was done for ease here.
}

,是的,它会编译。

相关内容

  • 没有找到相关文章

最新更新