C# 队列任务在线程池中丢失

C# 队列任务在线程池中丢失,c#,multithreading,wcf,rest,threadpool,C#,Multithreading,Wcf,Rest,Threadpool,我有一个用c#编写的RESTful服务,它用于通过一些内部API进行一些内部数据迁移(SQL到Mongo) 此REST服务正在从web服务获取SQL server数据,并将这些数据发布到另一个服务,该服务将向mongo DB插入数据 public void GetAllCoursesAndMigrateAllCourse(string clientstring, DataServiceCollection<Semester> semesters) {

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

此REST服务正在从web服务获取SQL server数据,并将这些数据发布到另一个服务,该服务将向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);
            }
        }
public void GetAllCourses和MigrateAllCourse(string客户端字符串,DataServiceCollection学期)
{
DataServiceCollection课程=null;
尝试
{
字符串端点=campusExploreUri+clientstring;
CampusExplorerServiceContext CampusExplorerServiceContext=新的CampusExplorerServiceContext(新的Uri(端点));
courses=新的DataServiceCollection(campusExplorerServiceContext.courses);
如果(课程!=null&&courses.Count>0&&semests!=null&&semests.Count>0)
QueueUserWorkItem(新WaitCallback(f=>{CreateCourse(课程,学期);}));
int cCount=100;
//这一步是必要的,因为每次呼叫的CE结果限制为100。这将确保我们获得所有结果
while(courses.Continuation!=null)
{
courses=newdataservicecollection(campusExplorerServiceContext.Execute(courses.Continuation.NextLinkUri));
如果(课程!=null&&courses.Count>0&&semests!=null&&semests.Count>0)
{
cCount=cCount+courses.Count;
_logger.Info(“帐户”+cCount);
QueueUserWorkItem(新的WaitCallback(k=>{CreateCourse(课程,学期);}));
}
}
}
捕获(例外情况除外)
{
_logger.Error(“GetAllCoursesAndMigrateAllCourse中的错误”+ex.Message);
}
}
在这里,我将所有get数据排队到ThreadPool,以处理createcourse函数。一旦get循环结束,w3wp进程停止处理,但w3wp进程在任务管理器进程中显示为idel,因此,我失去了所有数据,它们在Thredpool中排队

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


如何克服此问题?

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

是否设置了
ManualRestEvent

,在您的`Case-CreateCourse()

中,您的意思是您的进程在线程池队列完成其任务之前退出吗?是的,w3wp进程在完成所有排队任务之前停止。我收到错误“WaitHandles数必须小于或等于64”在应用事件后,请查看此解决方法。可能您应该尝试CountDownEvent(等待并发送信号)-假设您使用(.NET 4.0),它比我使用CountDownEvent尝试的ManualResetEvent简单得多,但是Wait()函数在所有后台进程完成之前结束(Isset==true)。您可以显示代码吗?您将Wait()放在哪里了方法…我假设排队后你的任务?
private static ManualResetEvent reset = new ManualResetEvent(false);
/*After you Queue*/ 
reset.WaitOne()