代码之家  ›  专栏  ›  技术社区  ›  Sailing Judo

异步方法似乎没有完全执行

  •  0
  • Sailing Judo  · 技术社区  · 17 年前

    我有一个过程,在这个过程中,一个传入的用户请求被处理到我们的系统中。我还希望在不影响主进程响应的情况下,向数据库表中添加一些关于请求的元数据。为了实现这一点,我添加了对异步方法的调用,如下所示:

    public static ReturnObject ResponsiveMethod(string ip, string code)
    {
       // ... some reasonably quick code
    
       IPDetail.InsertAsync(ip);  // <-- call to the async method
    
       return new ReturnObject(code);
    }
    

    insertAsync()方法如下:

       public static void InsertAsync(string ipAddress)
       {
            Action action = () => IPDetail.Insert(ipAddress);
            action.BeginInvoke(aResult => Log.Debug("Completed Insert"), null);
       }
    

    最后,通常称为insert()的非异步方法:

        private static void Insert(string ipAddress)
        {
            ApplicationContextHelper.LoadApplicationContext();
            var helper = new GeoLocationHelper();
            var result = helper.GetDetailsFromIP(ipAddress);
            Log.InfoFormat("Succesfully retreived IP data {0}.", ipAddress);
            result.Save();
        }
    

    在我的单元测试中,insertasync()调用工作正常。在insert()中的方法调用中,有许多操作正在发生,这些操作通过日志记录进行详细说明,并且所有预期的日志消息都在那里,以及result.save()方法的最终结果。

    但是,我们有一个WebService,它使用了上面的responsivemethod()方法,由于某些原因,异步调用没有完成。loadApplicationContext()方法中的所有日志记录都将被激发,但之后就没有与insert()相关的日志活动,并且永远不会执行result.save()。

    修改摘要问题,使其更简洁

    我目前的想法是,WebService已经完成了它的任务,并且调用异步的线程不再存在。这会阻止异步调用完成吗?

    3 回复  |  直到 17 年前
        1
  •  1
  •   John Saunders    17 年前

    我以前从来没有用过begininvoke,但通常在有begin*的地方,你也需要coresponding end*。请添加一个,以及正确的异常处理。

        2
  •  0
  •   Clyde    17 年前

    我的第一个想法是,出于某种原因,您可能会在Web服务场景中对异步调用抛出异常。我知道你可能为了在网上发布而削减了它,但是其中是否有“或多或少的不可靠”的错误处理代码?

        3
  •  0
  •   Gratzy    17 年前

    您是否依赖异步方法调用中调用方的标识?从Web服务调用时,标识可能会丢失。