我有用c#编写的RESTful服务,它通过一些内部api用于一些内部数据迁移(SQL到Mongo)。
此REST服务从Web服务获取SQL服务器数据,并将这些数据POST到另一个将数据插入mongo DB的服务,
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);
}
}
这里我将所有获取数据排队到ThreadPool来处理创建课程功能。一旦get循环结束,w3wp进程就停止了处理,但是w3wp进程在任务管理器进程中显示为idel,所以由于这个原因我丢失所有数据都在Thredpool中排队,
我已经删除了应用程序池循环时间,并在应用程序池设置中将空闲时间设置为0.
我如何克服这个问题?
答案 0 :(得分:0)
我假设您的进程在您的ThreadPool队列完成任务之前退出。您知道ThreadPool是后台线程(进程不会等到这些线程完成它的任务),如果您不这样做希望你的进程退出并等到队列完成它的任务,你可以使用ManualResetEvent(设置和等待)。
private static ManualResetEvent reset = new ManualResetEvent(false);
/*After you Queue*/
reset.WaitOne()
请务必设置ManualRestEvent
,在你的`Case-CreateCourse()