使用预处理程序指令在异步方法中抛出异常

时间:2016-06-22 13:12:27

标签: c# exception async-await c-preprocessor

我有一项任务是清理编译器警告的项目。目前我正在研究用于ASP.NET和Xamarin解决方案的cs文件。我有一个方法:

    public override async SomeReturnTypeItem LoginAsync()
    {
#if __MOBILE__
        throw new NotSupportedException("Windows authentication is not supported in mobile version");
#endif
    //some code
    }

在Xamarin解决方案中,我发出警告,#endif下的代码无法访问。如果我将#endif替换为#else并将#endif放到方法的末尾,我会收到一条警告:该方法缺少await运算符并将同步运行。如何使这种方法免于警告?

3 个答案:

答案 0 :(得分:2)

最简单的解决方法是

public override async SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
    throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
    //some code using await
#endif
}

但这可能不是您想要的行为,因为如果定义__MOBILE__ ,该方法将返回故障Task而不是立即投掷。差异有时可能非常大,主要是如果您存储Task以供以后使用而不是立即等待它(例如,如果您想要启动多个任务并让它们同时运行)。

要解决此问题,您应该将异常抛出代码放在方法中,将异步实现放在另一个方法中:

public override SomeReturnTypeItem LoginAsync()
{
#if __MOBILE__
    throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
    return LoginAsyncImpl();
#endif
}

private async SomeReturnTypeItem LoginAsync()
{
    //some code using await
} 

当然,如果您根本没有使用await,那么您不应该首先将方法标记为async

public override omeReturnTypeItem LoginAsync()
{
#if __MOBILE__
    throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
    //some code not using await
#endif
}

请注意,非异步代码仍然可以返回Task。这很有用,例如,如果你实现一个接口或基类,使某些方法返回任务,以便实现可能是异步的,但你的具体实现恰好是同步的。

public override Task SomeMethodAsync()
{
    // do some  synchronous stuff
    return Task.FromResutl(true);
}

答案 1 :(得分:0)

这有点难看,但你可以这样做:

    public override
#if !__MOBILE__
    async
#endif
    SomeReturnTypeItem LoginAsync() {
#if __MOBILE__
    throw new NotSupportedException("Windows authentication is not supported in mobile version");
#else
    //some code
#endif
    }

这假设您在“某些代码”中实际上有await关键字。如果没有,那么您应该删除async

或者,您只需使用#pragma指令来禁止警告: #pragma warning

答案 2 :(得分:0)

我使用的解决方案是欺骗编译器。

    public override async SomeReturnTypeItem LoginAsync()
    {
#if __MOBILE__
        bool isMobile = true;
        if (isMobile)
        {
            throw new NotSupportedException("Windows authentication is not supported in mobile version");
        }
#endif
        //some async code
    }

Visual Stuidio说异步代码是启发式无法访问的,但编译器很满意。当然它有点难看,但它确实有效。但是,谢谢你们试图提供帮助)