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

问题描述 投票:0回答:1

我是 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 |假的。

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

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

谁能告诉我我做错了什么?

欣赏 - 谢谢你

更新:

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

在Button Click 事件中,它不喜欢返回一个boolean 并要求将其转换为一个字符串。并非所有 Microsoft 解决方案都有效。

如果我将

Task<bool>
更改为
Task<string>
然后在任何地方使用 return
IsBanned.ToString();
它都有效。

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

我的VS版本:

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

我向 VS2022 开发人员社区提出的一些问题已在此站点以及 MSDN 站点上多次引用。

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

编辑/更新 2:

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

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

c# file asynchronous async-await
1个回答
1
投票

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

简而言之:

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

是的,它可以编译。

© www.soinside.com 2019 - 2024. All rights reserved.