C#中Window Service中的线程中止

时间:2018-01-04 06:24:55

标签: c# sql-server

我有一个窗口服务,它将PDF文件转换为html,并且它运行在5个线程中。 每个线程从状态为0的数据库中选择记录。一旦从数据库中选择记录,我们将状态设置为64并在日志文件中创建一个条目,以便其他线程不应选择相同的记录,在成功转换后我们正在制作状态为256,如果有任何异常,我们将层数设为128.

有些记录更新为64而没有记录中的任何条目,甚至没有进一步处理。

以下是从数据库中选择单条记录的存储过程。

    Create PROCEDURE [SGZ].[p_GetNextRequestForProcessing]
    @InstanceId int
    AS
    BEGIN
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    set nocount on

    Declare @RequestID bigint = null;

    SET @RequestID= (
                    Select 
                        TOP(1) RequestID 
                    From 
                        sgz.PDFTransformationQueue
                    Where
                        RequestStatusID=0
                );

    If (@RequestID is not null) 
    BEGIN
       Begin Transaction;
          Update 
             sgz.PDFTransformationQueue
          SET
            RequestStatusid=64,
            ProcessedInstanceID =@InstanceId,
            ProcessStartTime = getutcdate(),
            ModifiedDate=getutcdate()
         Where
            RequestID=@RequestID and
            RequestStatusid =0 and
            ProcessedInstanceID is null;

         if @@rowcount = 0
            set @RequestID=null;
    Commit Transaction;
   END

    Select 
        RQ.VersionNumber,RQ.RequestID, RP.Payload
    From
        SGZ.RequestPayload RP WITH (NOLOCK),
        SGZ.PDFTransformationQueue RQ WITH (NOLOCK)

    Where
        RP.RequestId=RQ.RequestID AND
        ProcessedInstanceID=@InstanceId AND
        RequestStatusid =64 AND
        RQ.RequestId = @RequestID;
    END 

以下是窗口服务代码: -

    protected override void OnStart(string[] args)
       {
          PDFTransAutoProcessManager pdfTransAutoProcessManager = new 
          PDFTransAutoProcessManager();
          pdfTransAutoProcessManager.OnProcessStart();
        }

PDFTransAutoProcessManager类: -

    private int _runningAsyncThread = 0;
    private int _totalAsynThread = 5;

    public void OnProcessStart()
        {
          _logMgr.Info("Process started @ " + DateTime.Now);
           mainThread = new Thread(new ThreadStart(StartAutoProcess));
           mainThread.Priority = ThreadPriority.Highest;
           mainThread.Start();
        }

      private void StartAutoProcess()
       {
          try
           {
              while (true)
               {
                  if (_runningAsyncThread < _totalAsynThread)
                  {

                      Thread childThread = new Thread(() => ProcessAsync());
                      Interlocked.Increment(ref _runningAsyncThread);
                      childThread.Start();
                  }
                  Thread.Sleep(100);
              }

          }
          catch (Exception ex)
          { }
      }

        private void ProcessAsync()
          {
           try
           {
              PDFGenieManager pdfGenieManager = new 
              PDFGenieManager(_logMgr,gmi);
              pdfGenieManager.ProcessRawData();
           }
           catch (Exception ex)
            {
              _logMgr.Info(ex.Message);
              _logMgr.Info(ex.StackTrace);
             }
            finally
            {
            Interlocked.Decrement(ref _runningAsyncThread);
            }
        }

在PDFGenieManager类中实际的数据库调用和转换将会发生。 当它试图从数据库中获取记录时,一些记录被更新为64而没有记录中的任何条目。

是否与线程模式或存储过程有任何问题有关。 请提前帮助谢谢。

以下是PDFGenieManager类代码: -

    namespace PDFConvertion
     {
       public class PDFGenieManager
         {
           public Logger _logMgr;
           public GmiManager _gmi;
           string _environment;
           static readonly object _object = new object();
           Dictionary<string, string> _ResourceMetadata = new Dictionary<string, string>();
    public PDFGenieManager(Logger logMgr, GmiManager gmi)
    {
        _logMgr = logMgr;
        _gmi = gmi;
        _environment = ConfigurationManager.AppSettings["Envoirnment"];
    }
    public void ProcessRawData()
    {
        try
        {
            string unlockKey = string.Empty;
            string languageRepair = string.Empty;
            bool IsUnicodeRepair = false;
            double confidenceScore = 1.0;
            var Vendor = string.Empty;
            string hiddenText = string.Empty;
            DataTable rawData = new DataTable();
            RuntimeCacheMgr _runtimeCacheMgr = new RuntimeCacheMgr();

            DAL dal = new DAL();
            try
            {
                rawData = dal.GetRawData();
                if (rawData != null && rawData.Rows.Count > 0)
                {
                    _logMgr.Info("Picked the record from datbase" + rawData.Rows[0]["Payload"].ToString());
                }
                if (!_runtimeCacheMgr.Exists(_environment))
                {
                    _ResourceMetadata = dal.getResourcemetaDataValue(_environment);
                    _runtimeCacheMgr.Add(_environment, _ResourceMetadata);
                }
                else
                {
                    _ResourceMetadata = _runtimeCacheMgr.Get<Dictionary<string, string>>(_environment);
                }
            }
            catch (SqlException exe)
            {
                _logMgr.Error("Sql Database Error While Picking the records from database" + exe.Message + exe.StackTrace, exe.InnerException);
            }
            catch (Exception ex)
            {
                if (ex != null && !ex.ToString().ToLower().Contains("already exist"))
                {
                    if (rawData != null && rawData.Rows.Count > 0)
                    {
                        _logMgr.Error("Exception block Picked the record from datbase" + rawData.Rows[0]["Payload"].ToString());
                    }
                    _logMgr.Error("Exception block" + ex.Message);
                    return;
                }
                else
                {
                    if (rawData != null && rawData.Rows.Count > 0)
                    {
                        _logMgr.Error("Cache block Picked the record from datbase" + rawData.Rows[0]["Payload"].ToString());
                    }
                    _logMgr.Error("Cache block" + ex.Message + "" + ex.StackTrace);
                }
            }
            finally
            {
                if (rawData != null && rawData.Rows.Count > 0)
                {
                    _logMgr.Info("Finally block Picked the record from datbase" + rawData.Rows[0]["Payload"].ToString());
                }
            }
            List<PDFGenieTran> ids = new List<PDFGenieTran>(rawData.Rows.Count);
            rawData.AsEnumerable().ToList().ForEach(row => ids.Add(new PDFGenieTran() { Payload = row["Payload"].ToString(), RequestID = Convert.ToInt64(row["RequestID"]), VersionNumber = row["VersionNumber"].ToString() }));

            PDFNetStatus PDFstatus = new PDFNetStatus();
            foreach (PDFGenieTran pdf in ids)
            {
            }

0 个答案:

没有答案