线程任务在ThreadPool中丢失

时间:2014-06-22 14:46:39

标签: c# multithreading wcf rest threadpool

我有用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.

我如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

请务必设置ManualRestEvent     ,在你的`Case-CreateCourse()