队列任务丢失在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是后台线程(进程不会等待,直到这些线程完成它的任务),如果你不想让你的进程退出,直到队列完成它的任务,你可以使用ManualResetEvent(设置和等待)。
private static ManualResetEvent reset = new ManualResetEvent(false);
/*After you Queue*/
reset.WaitOne()
请确保设置了ManualRestEvent
, In your ' case - createccourse ()