public override Thread Create()
        {
            return(new Thread(() =>
            {
                try
                {
                    ProgramTasksThread.InitDataByXML();

                    for (var i = 0; i < 4; i++)
                    {
                        Task.Run(() => UploadResume());
                    }

                    for (var i = 0; i < 8; i++)
                    {
                        Task.Run(() => PortfolioResume());
                    }

                    Task.Run(() => ImportResume());

                    Task.Run(() => HandleOldDomResume());

                    GetResumes();
                }
                catch (Exception ex)
                {
                    Trace.TraceError(ex.ToString());
                }
            })
            {
                IsBackground = true
            });
        }
        /// <summary>
        /// 上传简历
        /// </summary>
        private static void UploadResume()
        {
            var serializer = new Serialization.Template.Zhaopin.Json.v1.Serializer();

            var stopwatch = new Stopwatch();

            while (true)
            {
                string path;

                if (!uploadQueue.TryDequeue(out path))
                {
                    Thread.Sleep(100);

                    continue;
                }

                Interlocked.Increment(ref totalUpload);

                try
                {
                    stopwatch.Restart();

                    var resumeId = Convert.ToInt32(Path.GetFileNameWithoutExtension(path));

                    var content = File.ReadAllText(path);

                    var jsonObj = JsonConvert.DeserializeObject <dynamic>(content);

                    dynamic formatterResume;

                    try
                    {
                        if (jsonObj.Flag != null && jsonObj.Flag < 0)
                        {
                            formatterResume = Format.Convert_V0(Format.ConvertTo_Dtl_V5(content));
                        }
                        else
                        {
                            var serializationResume = serializer.Deserialize(content);

                            formatterResume = Formatter.Template.Zhaopin.Json.v1.Formatter.Format(serializationResume);
                        }
                    }
                    catch (Exception ex)
                    {
                        var filePath = $"{ConfigurationManager.AppSettings["File.FailPath"]}{Path.GetFileName(path)}";

                        if (File.Exists(filePath))
                        {
                            File.Delete(filePath);
                        }

                        File.Move(path, filePath);

                        Trace.TraceError(ex.ToString());

                        using (var db = new MangningXssDBEntities())
                        {
                            var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId);

                            if (resume != null)
                            {
                                resume.Flag = 0xA;
                            }

                            db.SaveChanges();
                        }

                        continue;
                    }

                    string tag;

                    while (true)
                    {
                        var data = JsonConvert.SerializeObject(new
                        {
                            formatterResume.Reference.Id,
                            formatterResume.Reference.Source
                        });

                        var response = PrepareUploadResume(data);

                        if (response.Code.ToString() != "0")
                        {
                            FinishUploadResume(data);

                            Trace.WriteLine($"{DateTime.Now} > PrepareUploadResume failed ! Data = {data}, Response = {JsonConvert.SerializeObject(response)}");

                            continue;
                        }

                        var badoucaiResumeJson = JsonConvert.SerializeObject(formatterResume);

                        response = UploadResume(badoucaiResumeJson);

                        var returnCode = (string)response.Code;

                        using (var db = new MangningXssDBEntities())
                        {
                            tag = response.Reference?.Tag.ToString();

                            db.ZhaopinResumeUploadLog.Add(new ZhaopinResumeUploadLog
                            {
                                ResumeId   = resumeId,
                                ReturnCode = returnCode,
                                Tag        = tag,
                                UploadTime = DateTime.Now
                            });

                            FinishUploadResume(data);

                            var resume = db.ZhaopinResume.FirstOrDefault(f => f.Id == resumeId);

                            if (resume != null)
                            {
                                resume.Flag = 0xF;
                            }

                            if (jsonObj.Flag != null && jsonObj.Flag < 0)
                            {
                                resume.Flag = 0xB;
                            }

                            if (returnCode != "0")
                            {
                                Trace.WriteLine($"{DateTime.Now} > UploadResume failed !ResumeId = {resumeId}, Response = {JsonConvert.SerializeObject(response)}.");

                                tag = "NULL";

                                db.SaveChanges();

                                var filePath = $"{ConfigurationManager.AppSettings["File.UploadFailPath"]}{Path.GetFileName(path)}";

                                if (File.Exists(filePath))
                                {
                                    File.Delete(filePath);
                                }

                                File.Move(path, filePath);

                                break;
                            }

                            if (tag == "C" || tag == "U" || tag == "N")
                            {
                                using (var stream = new MemoryStream(GZip.Compress(Encoding.UTF8.GetBytes(badoucaiResumeJson))))
                                {
                                    var id = response.Reference.ResumeId.ToString();

                                    badoucaiOssClient.PutObject(badoucaiBucketName, $"Badoucai/{id}", stream);
                                }

                                ProgramTasksThread.HandleResume(content, resumeId); // 更新 Resume 表的信息
                            }

                            File.Delete(path);

                            db.SaveChanges();

                            Interlocked.Increment(ref successUpload);
                        }

                        break;
                    }

                    stopwatch.Stop();

                    Console.WriteLine($"{DateTime.Now} > ResumeId = {resumeId}, Tag = {tag}, {successUpload}/{totalUpload} = {Math.Round(successUpload / (double)totalUpload, 3) * 100}%, Elapsed = {stopwatch.ElapsedMilliseconds} ms.");
                }
                catch (Exception ex)
                {
                    Trace.TraceError(ex.ToString());
                }
            }
        }