Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# 在异步函数内调用非异步方法_C#_Async Await - Fatal编程技术网

C# 在异步函数内调用非异步方法

C# 在异步函数内调用非异步方法,c#,async-await,C#,Async Await,请帮助我理解下面代码段的异步/等待操作 1. public async Task OuterMethodAsync(MyObject obj1) 2. { 3. var dbResult = await repo.SomeDB_GetCallAsync(obj1.id); 4. var httpResult = await Function1ContainingHTTPCallAsync(dbResult); 5. dbResult.param1 = obj1.p

请帮助我理解下面代码段的异步/等待操作

1. public async Task OuterMethodAsync(MyObject obj1)

2. {

3.     var dbResult = await repo.SomeDB_GetCallAsync(obj1.id);

4.     var httpResult = await Function1ContainingHTTPCallAsync(dbResult);

5.     dbResult.param1 = obj1.param1;

6.     var isSuccess = Function2(httpResult, dbResult);

7.     await repo.SomeDB_UpdateAsync(dbResult);

8.     if(isSuccess)
9.      {
10.         // Do some stuff
11.     }

12. }
如果函数2的输入参数httpResult为null,则该函数应该返回false

根据包含TTPCallasync的函数1中的日志

  • 它已成功执行http调用
  • 返回了一个非空字符串的有效响应httpResult
  • 但是,根据Function2中的日志

  • 它已将输入参数httpResult接收为null
  • 返回一个错误的
  • 这里,

  • 功能2不是异步的
  • 功能1包含TTPCallasync是异步的
  • SomeDB_GetCallAsync是异步的
  • SomeDB_UpdateAsync是异步的
  • OuterMethodAsync是异步的
  • 我在这里看到的问题是isSuccess被设置为false。另外,请注意,OuterMethod可能会被多次调用(这是框架中失败HTTP调用的重试机制)。考虑到OuterMethod本身就是一个作为HTTP调用调用的API,它会导致这个问题吗

    我在这里看到的问题是isSuccess被设置为false,这只有在第6行在第4行之前执行时才会发生

    您有正确的
    await
    用法,因此:第6行在应该执行之前未执行。您必须研究
    Function2
    可以返回
    false
    的场景,并可能使用调试器查看发生了什么。从这里我们可以看出,所示的代码很好

    请注意,在调试环境中,在有意义地定义/分配
    issucess
    之前,您可能会看到它的值-例如,如果您在
    OuterMethod
    上设置断点。这并不意味着第6行已经执行;这只是意味着调试器可以看到幕后的情况。严格地说,第6行之前的值是未定义的,但实际上,由于C#编译器发出
    .locals init
    (至少目前),它将是
    false
    ,因为
    false
    bool
    的默认值


    您可能还想检查
    OuterMethod
    是否会被单独调用两次。

    这不会编译,因为
    OuterMethod
    没有返回类型。请显示您的真实代码。第6行的参数是第4行的结果,因此第6行不能在第4行之前执行。@someone OuterMethod返回void(Task)。此外,任何
    async
    的内容都应以
    async
    作为后缀。然而,撇开我的强迫症不谈<代码>等待实际上在等待,尽管其中一些代码可能会被推送到IO完成端口,但代码将按顺序运行。答案是,不,假设您等待所有异步调用,那么第6行将不会在第4行之前执行。您的假设(只有在第6行在第4行之前执行时才会发生)是否有缺陷?如果这个假设是正确的,
    Function2
    将毫无用处,除非您依赖它的一些副作用。不管怎样,是什么阻止了你调试这个程序,阻止了你一步一步地去看会发生什么呢?谢谢你的详细回复。我还补充了几点:Function2应该返回false,前提是它的输入参数httpResult为null。根据Function1ContainingHTTPCallAsync中的日志,它已成功执行,并返回了一个非空字符串的有效响应httpResult。但是,根据Function2中的日志,它已将输入参数httpResult接收为null,因此,回答false@CodingEveryDay然后,您需要查看
    function1containingTTPCallasync
    以了解在什么情况下它可以返回
    null
    -可能存在恶意
    catch(Exception ex){Log(ex);return null;}
    -因为编写的代码:很好。或者,我重复我自己的话:使用调试器,看看值是什么这在生产设置中发生了,我在那里看到了日志,当我在本地使用调试点尝试它时,它是不同的。函数2实际上返回一个true@CodingEveryDay然后需要改进日志记录;不管发生了什么:它不是特定于您所展示的代码的,所以您需要超越它that@CodingEveryDay要评论这一点,我需要足够的代码来重新编程;你有密码,我没有;你得调查一下