gpt4 book ai didi

c# - 这是一种安全且*相对可行*的异步记录某些事件的方法吗?

转载 作者:行者123 更新时间:2023-11-30 22:07:53 24 4
gpt4 key购买 nike

合作:

  • .NET 4.5.1
  • 网络表单
  • Entity Framework 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();
}
}
}

问题:

  • 这是一种足够好的方式来记录我需要的内容吗?它在多用户环境中安全吗?
  • 如果您不想深入研究日志框架,您会怎么做?

最佳答案

是的,在多线程环境下是安全的。因为每次将事件插入数据库时​​都会创建数据库上下文的新实例,所以您是安全的。只有当您尝试跨线程重用相同的上下文实例时,EF 才不是线程安全的。

唯一可能的问题是以异步方式执行此操作可能意味着同时打开多个连接并且连接池可能会耗尽。您登录的频率越高,发生这种情况的可能性就越大。

话虽如此,我仍然建议您使用 log4net 或任何现有的日志记录基础架构,并找到一种异步记录的方法。人们经常在博客上写如何使用 log4net 执行此操作,例如查看此处

http://www.ben-morris.com/using-asynchronous-log4net-appenders-for-high-performance-logging

请注意,那里也讨论了与异步日志记录相关的问题。要解决一些问题,例如条目排序错误的可能性,您可以在此类自定义 appender 中有一个队列。坚持使用现有框架可以让您重用许多已经开发的想法。当需求发生变化时,迟早要独自行动会让你停滞不前。

关于c# - 这是一种安全且*相对可行*的异步记录某些事件的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22659470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com