共享数据访问逻辑时 C# WebAPI 线程中止

如何解决共享数据访问逻辑时 C# WebAPI 线程中止

我的 C# Web API 出现以下错误:“抛出异常:System.Data.dll 中的 System.Threading.ThreadAbortException” 线程被中止”。我在一个线程上有一个长时间运行的进程,使用我的数据访问逻辑类来获取和更新正在处理的记录。同时,用户提交另一个组来处理需要相同数据访问逻辑类的进程,从而导致在错误中。这是我正在做的事情的粗略草图。

WebAPI 类

public IHttpActionResult OkToProcess(string groupNametoProcess)
{
    var logic = GetLogic();
    //Gets All Unprocessed Records and Adds them to Blocking Queue
    Task.Factory.StartNew(() => dataAccessLogic.LoadAndProcess(groupNametoProcess);
}

public IHttpActionResult AddToProcess(int recordIdToProcess)
{
    StaticProcessingFactory.AddToQueue(recordIdToProcess);
}

StaticProcessingFactory

internal static ConcurrentDictionary<ApplicationEnvironment,Logic> correctors = new ConcurrentDictionary<ApplicationEnvironment,Logic>();
        internal static BlockingCollection<CorrectionMessage> MessageQueue = new BlockingCollection<Message>(2000);

public void StartService(){
   Task.Factory.StartNew(() => LoadService());
}

public void LoadService(){
    var logic = GetLogic();
    if(isFirstGroupOkToProcessAsPerTextFileLog())
         logic.LoadAndProcess("FirstGroup");
    if(isSeconddGroupOkToProcessAsPerTextFileLog())
         logic.LoadAndProcess("SecondGroup");
}

public static GetLogic(){
     var sqlConnectionFactory = Tools.GetsqlConnectionFactory();
     string environment = ConfigurationManager.AppSettings["DefaultApplicationEnvironment"];
     ApplicationEnvironment applicationEnvironment = 
         ApplicationEnvironmentExtensions.ToApplicationEnvironment(environment);
     return correctors.GetorAdd(applicationEnvironment,new Logic(sqlConnectionFactory ));
}

        public static void AddToQueue(Message message,bool completeAdding = true)
        {
            if (MessageQueue.IsAddingCompleted)
                MessageQueue = new BlockingCollection<Message>();

            if (completeAdding && message.ProcessImmediately)
                StartQueue(message);
            else
                MessageQueue.Add(message);
        }

     public static void StartQueue(Message message = null)
     {
          if (message != null)
            { 
                if(!string.IsNullOrEmpty(message.ID))
                    MessageQueue.Add(message);
                Logic logic = GetLogic(message.Environment);

                try
                {
                    var messages = MessageQueue.TakeWhile(x => logic.IsPartOfGroup(x.GroupName,message.GroupName));
                    if (messages.Count() > 0)
                        MessageQueue.CompleteAdding();
                    int i = 0;
                    foreach (var msg in messages)
                    {
                        i++;
                        Process(msg);
                    }
                }
                catch (InvalidOperationException) { MessageQueue.CompleteAdding(); }

            }
     }

     public static void Process(Message message)
     {
         Var logic = GetLogic(message.Environment);
         var record = logic.GetRecord(message.ID);
         record.Status = Status.Processed;
         logic.Save(record);
     }

逻辑类

private readonly DataAccess DataAccess;

public Logic(sqlConnectionFactory factory)
{
     DataAccess = new DataAcess(factory);
}

public void LoadAndProcess(string groupName)
{
     var groups = DataAccess.GetGroups();
     var records = DataAccess.GetRecordsReadyToProcess(groups);
     for(int i = 0; i < records.Count; i++)
            {
                Message message = new Message();
                message.Enviornment = environment.ToString();
                message.ID = records[i].ID;
                message.User = user;
                message.Group = groupName;
                message.ProcessImmediately = true;

                StaticProcessingFactory.AddToQueue(message,i + 1 == records.Count);
            }
}

有什么想法可以确保来自所有线程的所有流量都可以访问数据访问逻辑,而不会系统地中止线程吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?