Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Web服务-返回然后最终返回-首先发生什么_C#_Asp.net_.net_Web Services_Try Finally - Fatal编程技术网

C#Web服务-返回然后最终返回-首先发生什么

C#Web服务-返回然后最终返回-首先发生什么,c#,asp.net,.net,web-services,try-finally,C#,Asp.net,.net,Web Services,Try Finally,在C#NET中,让我们以下面的例子为例 [WebMethod] public int TakeAction() { try { //Call method A Return 1; } catch (Exception e) { //Call method B Return 0; } finally { //Call method C } } 现在让我们假设方法C是一个长期运行的过程

在C#NET中,让我们以下面的例子为例

[WebMethod]
public int TakeAction()
{
    try {
        //Call method A
        Return 1;
    } catch (Exception e) {
        //Call method B
        Return 0;
    } finally {
        //Call method C
    }
}
现在让我们假设方法C是一个长期运行的过程

调用TakeAction的客户端是在调用方法C之前还是在调用/完成它之后返回返回值?

首先计算返回值,然后执行最后一个块,然后将控制传递回调用方(带有返回值)。如果finally块更改返回值的表达式,则此顺序非常重要。例如:

Console.WriteLine(Foo()); // This prints 10

...

static int Foo()
{
    int x = 10;
    try
    {
        return x;
    }
    finally
    {
        // This executes, but doesn't change the return value
        x = 20;
        // This executes before 10 is written to the console
        // by the caller.
        Console.WriteLine("Before Foo returns");
    }
}

finally块中的任何内容都是在离开try块后执行的。在您的例子中,它返回1或0,然后执行方法c。
有关try catch finally的更多信息,请参考

返回1,然后执行方法C。。。。。这篇文章的另一个答案正好相反。。。。。已计算返回值--最终执行--然后,将控件传递回调用方。。。。。不确定该相信什么=\n不,控件在方法C之后返回给调用方。这可能是您的意思,但从您的回答中不清楚。@adam:如果有疑问,请相信Jon Skeet。但关键(在这个答案中没有明确说明)是,直到最后一个块被执行之后,控制才会返回给调用者。是的。控件在执行方法c后返回,但返回值在try块中设置,并且不会更改。如果我指示错误,请道歉。此外,即使在最后一个块之前[评估]返回。。。。我的主要问题是找出调用方在什么时候收到返回/响应?在finally执行之前还是之后?@adam:在finally块执行之后-这就是我所说的“控制权被传递回调用方”的意思。检查这一点很容易——只需运行我展示的代码。它将在打印10之前打印“在Foo返回之前”。当然可以,谢谢Jon!我想这对Web服务也是一样的吗?@adam:是的。它是语言的一个基本部分,对于任何用途都是一样的。