【问题标题】:Strange try..catch behaviour with async奇怪的 try..catch 异步行为
【发布时间】:2012-08-17 14:26:55
【问题描述】:

我开始使用 .NET 4.5,尤其是 async/await 功能。

我看到下面的代码,令我惊讶的是,它编译了。谁能解释一下我的原因?

async Task SomeMethod()
{
    try
    {
        await Task.Delay(1000);
    }
    catch
    {

    }
}

对于以前的 .NET 版本,编译器会抱怨类似以下的消息:“并非所有路径都返回值”。

【问题讨论】:

    标签: c# asynchronous exception-handling


    【解决方案1】:

    返回Task 的异步方法等效于返回void 的普通方法。这里没有特定于 try/catch 的内容 - 不要忘记您的 try 块也不会返回任何内容!

    因此,您的代码的非异步版本将是:

    void SomeMethod()
    {
        try
        {
            Thread.Sleep(1000)
        }
        catch
        {
        }
    }
    

    ... 显然这会编译。 (同样显然,使用裸露的catch 很糟糕,但我认为这不是真正的问题:)

    代码无法编译:

    async Task<int> SomeMethod()
    {
        try
        {
            await Task.Delay(1000);
            return 10;
        }
        catch
        {
    
        }
    }
    

    【讨论】:

    • 现在看起来很清晰。你能给我一个链接到一些详细讨论异步/等待的幕后发生了什么的文章吗?
    • @dzendras:MSDN 会有很多,但您也可以阅读我的 Eduasync 系列:msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx 请注意,随着时间的推移,该功能发生了一些变化。
    • 谢谢,我去看看。
    【解决方案2】:

    针对您对 Jon 的回答提出的问题,我将这些链接添加为单独的答案以提高可读性。

    为了获得有关幕后发生的事情的更多信息,我想向您指出 MSDN 杂志中的这些文章,这些文章帮助我开始使用它:

    MSDN 2011 年 10 月号:Parallel Programming with .NET

    1. Pause and Play with Await
    2. Async Performance: Understanding the Costs of Async and Await
    3. Easier Asynchronous Programming with the New Visual Studio Async CTP

    尤其是前两篇文章可能是您正在寻找的内容,因为它们更好地描述了编译器如何在内部重写您的代码以使 async/ await 工作。

    【讨论】:

    • 谢谢!这就是我一直在寻找的。​​span>
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2011-09-16
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多