'奇怪'嵌套的ContinueWith语句的行为

时间:2016-08-04 19:30:19

标签: c# azure asynchronous task-parallel-library

我继承了一个使用异步调用来处理各种事情的Web服务,但是我遇到了一个我无法正确解释的问题。

我(基本上)有以下工作流程。

public CustomObject Work()
{
    //synchronous work omitted
    ContinueWithMethod1();
    return retval;
}

public void ContinueWithMethod1()
{
     ContinueWithMethod2().ContinueWith(x=> 
     { 
         if(x.IsFaulted) { //log error } 
     });
}

public Task<CustValue> ContinueWithMethod2()
{
    <AzureDocumentDBLibrary>.UpsertDocumentAsync(value, value).ContinueWith(y =>
    {
       if(y.IsFaulted) throw y.Exception;
       //populate CustValue
       return retval;
    }
    );
}

这里的想法是ContinueWithMethod1()方法内部对Work()的调用是&#34;火灾和遗忘&#34;以便在调用return retval;后立即执行ContinueWithMethod1()语句。如果我在ContinueWithMethod1()ContinueWithMethod2()上设置了断点,那么断点就会如我所料,我也不会在Visual Studio中看到任何错误。问题是我对Azure的调用没有上传任何内容。

其他一些要点:

  • 如果我连续两次执行此逻辑,则第二次调用次成功,但第一次总是失败。
  • 如果我更改ContinueWithMethod1()以匹配下面的代码示例,则第一次传递时一切正常。

代码示例如下

public async void ContinueWithMethod1()
{
     await ContinueWithMethod2();
}

我认为我在这里遇到的问题是,ContinueWithMethod2()用户和服务器之间的webrequest连接可能会超时多久。

有没有人遇到嵌套ContineWith()语句的问题?如果是这样,你可以解释发生了什么,也许如何调试导致我第一次调用Azure丢失的事件序列?

0 个答案:

没有答案