我有一个进程,其中正在处理对我们系统的传入用户请求。我还想在不影响主进程响应的情况下,将有关请求的一些元数据添加到数据库表中。为此,我添加了对这样的异步方法的调用:
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已完成其任务,并且调用异步的线程不再存在。这会阻止异步调用完成吗?
答案 0 :(得分:1)
我之前从未使用过BeginInvoke,但通常在有Begin *的地方,你也需要相应的End *。请添加一个,以及正确的异常处理。
答案 1 :(得分:0)
我的第一个想法是,由于某种原因,您可能会在Web服务方案中对异步调用抛出异常。我知道你可能已经把它发布到网上了,但那里有没有“或多或少不可用”的错误处理代码?
答案 2 :(得分:0)
您是否依赖Async方法调用中的调用者身份?从Web服务调用时,身份可能会丢失。