队列任务丢失在ThreadPool中

本文关键字:ThreadPool 任务 队列 | 更新日期: 2023-09-27 18:10:00

我有一个用c#编写的RESTful服务,它用于通过一些内部api进行一些内部数据迁移(SQL到Mongo)。

这个REST服务从web服务获取SQL server数据,并将这些数据POST到另一个服务,该服务将数据插入mongodb,

public void GetAllCoursesAndMigrateAllCourse(string clientstring, DataServiceCollection<Semester> semesters)
        {
            DataServiceCollection<Campus.Explorer.Proxy.Models.Course> courses = null;
            try
            {
                string endpoint = campusExploreUri + clientstring;
                CampusExplorerServiceContext campusExplorerServiceContext = new CampusExplorerServiceContext(new Uri(endpoint));
                courses = new DataServiceCollection<Campus.Explorer.Proxy.Models.Course>(campusExplorerServiceContext.Courses);
                if (courses != null && courses.Count > 0 && semesters != null && semesters.Count > 0)
                    ThreadPool.QueueUserWorkItem(new WaitCallback(f => { CreateCourse(courses, semesters); }));
               int cCount =100;
                //this step is necessary because CE results are limited to 100 per call. This will ensure we get all results
                while (courses.Continuation != null)
                {
                    courses = new DataServiceCollection<Campus.Explorer.Proxy.Models.Course>(campusExplorerServiceContext.Execute<Campus.Explorer.Proxy.Models.Course>(courses.Continuation.NextLinkUri));
                    if (courses != null && courses.Count > 0 && semesters != null && semesters.Count > 0)
                    {
                        cCount = cCount + courses.Count;
                        _logger.Info("cCount " + cCount);
                        ThreadPool.QueueUserWorkItem(new WaitCallback(k => { CreateCourse(courses, semesters); }));
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error("Error in GetAllCoursesAndMigrateAllCourse " + ex.Message);
            }
        }

在这里,我将所有get数据排队到ThreadPool以处理创建课程函数。一旦get循环结束后,w3wp进程停止处理,但w3wp进程在任务管理器进程中显示为理想状态,因此,我正在丢失所有数据,在线程池中排队,

我已经删除了应用程序池的回收时间,并在应用程序池设置中将空闲时间设置为0。

我如何克服这个问题?

队列任务丢失在ThreadPool中

我假设你的进程在线程池队列完成任务之前退出。猜你知道ThreadPool是后台线程(进程不会等待,直到这些线程完成它的任务),如果你不想让你的进程退出,直到队列完成它的任务,你可以使用ManualResetEvent(设置和等待)。

private static ManualResetEvent reset = new ManualResetEvent(false);
/*After you Queue*/ 
reset.WaitOne()

请确保设置了ManualRestEvent, In your ' case - createccourse ()