【发布时间】:2015-06-19 00:05:01
【问题描述】:
我正在构建一个将所有内容存储在 Azure 表中的日志库。写入该表显然需要很多时间(从不超过 1 秒,但仍然太多让用户等待),所以 Log 方法返回一个 LogResult 实例,这是类
public class LogResult
{
public string Id { get; set; }
public Task LoggingTask { get; set; }
public LogResult(string id, Task task)
{
Id = id;
LoggingTask = task;
}
}
下面是 Log 方法的完成方式
return new LogResult(id, Task.Factory.StartNew(() =>
DoLogInAzure(account, id, exception, request))
);
为调用者提供等待它完成的选项(例如,如果它是控制台应用程序)。我面临的问题是 IIS 不应该在返回用户响应之前等待它......如果我不等待它,IIS 不会 总是 执行任务。这个想法是向用户显示一条消息“......如果您与我们联系,请务必提及您的问题编号,XXX”,并且不要让他等到写入日志条目。
有没有办法强制 IIS 等到任务完成,即使它返回了响应?我想我可能需要编写一个异步接收请求的 Windows 服务,但看起来只是添加一个日志条目需要做很多工作......特别是如果我可以强制 IIS 等待它的话。
感谢您的任何想法!
【问题讨论】:
-
我听说 IIS 会重新启动占用太多内存的“网站”...
-
我明白 :) 但是,我不认为这是我的情况,好像我等待任务结束,IIS 完成执行并且日志条目被写入 100% 次跨度>
-
作为替代方案,您能否仅使用 azure 队列登录。然后一个单独的消息处理程序可以异步写入 azure 表。更好的是,如果您在处理过程中遇到错误,消息仍保留在队列中,稍后将再次处理。
-
@usr:Id 可以是 Guid 或增量数字。如果是Guid,则生成不花时间,logger返回Id,然后将数据存储在后台。我确实需要向用户显示 ID。
-
@ChrisChilvers 是的... Windows 服务或辅助角色可以解决问题,但实际上... 应用程序拥有的组件越多,您需要在新版本中更新的内容就越多,更多的事情会出错......如果没有其他办法,我会选择这条路......但我想把它作为最后的手段
标签: .net iis task-parallel-library