【发布时间】:2014-04-10 23:38:39
【问题描述】:
使用:
- .NET 4.5.1
- 网络表单
- 实体框架 6(每个请求的上下文)
- IIS 8、Windows 2012 数据中心
主要关注点:线程安全性和可靠性。
该项目由一个封闭的系统组成,可供多种类型的用户使用,这些用户将执行各种操作。在我们当前的项目中,我决定实现一些可能大多数开发人员认为绝对必要的东西。
过去,由于缺乏最简单的日志系统,我们无法跟踪一些常见的用户操作,尤其是操纵数据,因此存在严重的问题。
我知道有流行的日志框架,但我想实现一些相对简单的不会阻塞主线程的东西。
我的想法是在主线程上提取我需要的所有数据,因为事实证明有些数据更难从单独的线程访问,然后创建一个任务来处理数据库插入。我对多线程的了解是有限的,这就是我想出的。
public static class EventLogger
{
public static void LogEvent(int eventType, string descr, Exception ex = null)
{
//Get the page that is currently being executed;
var executingPage = HttpContext.Current.CurrentHandler as Page;
string sourcePage = executingPage != null ? executingPage.AppRelativeVirtualPath : string.Empty;
var eventToAdd = new Event()
{
Date = DateTime.Now,
EventTypeId = eventType,
isException = ex != null ? true : false,
ExceptionDetails = ex != null ? ex.Message : string.Empty,
Source = sourcePage,
UserId = UserHelper.GetUserGuid(),
UserIP = UserHelper.GetUserIP(),
UserName = UserHelper.GetUserName(),
Description = descr
};
Task.Factory.StartNew(() => LogEventAsync(eventToAdd));
}
private static void LogEventAsync(Event eventToAdd)
{
using (var context = new PlaceholderEntities())
{
context.Events.Add(eventToAdd);
context.SaveChanges();
}
}
}
问题:
- 这是一种足够好的方式来记录我需要的内容吗?在多用户环境中是否安全?
- 如果您不想深入研究日志框架,您会怎么做?
【问题讨论】:
-
如果您想在同一个线程上序列化对 DbContext 的访问,请检查:stackoverflow.com/q/20993007/1768303
-
@Noseratio - 谢谢。
标签: c# asp.net multithreading entity-framework