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

时间:2009-06-18 13:50:34

标签: c# .net web-services asynchronous

我有一个进程,其中正在处理对我们系统的传入用户请求。我还想在不影响主进程响应的情况下,将有关请求的一些元数据添加到数据库表中。为此,我添加了对这样的异步方法的调用:

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()方法的最终结果。

但是,我们有一个web服务,它使用上面的ResponsiveMethod()方法,并且出于某种原因,异步调用没有完成。 LoadApplicationContext()方法中的所有日志记录都会被触发,但之后没有与Insert()相关的日志活动,并且result.Save()永远不会被执行。

修订后的摘要问题更简洁

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

3 个答案:

答案 0 :(得分:1)

我之前从未使用过BeginInvoke,但通常在有Begin *的地方,你也需要相应的End *。请添加一个,以及正确的异常处理。

答案 1 :(得分:0)

我的第一个想法是,由于某种原因,您可能会在Web服务方案中对异步调用抛出异常。我知道你可能已经把它发布到网上了,但那里有没有“或多或少不可用”的错误处理代码?

答案 2 :(得分:0)

您是否依赖Async方法调用中的调用者身份?从Web服务调用时,身份可能会丢失。