/// <summary>
 /// return pos tagger to the tagger pool
 /// </summary>
 /// <param name="tagger"></param>
 public static void ReturnPosTagger(PosTagger tagger)
 {
     for (var i = 0; i < taggers.Count; i++)
     {
         if (tagger == taggers[i])
         {
             lock (availableTaggers)
             {
                 availableTaggers.Add(i);
             }
             break;
         }
     }
 }
 /// <summary>
 /// Get a pos tagger from parser pool
 /// </summary>
 /// <returns></returns>
 public static PosTagger GetPosTagger()
 {
     lock (locker)
     {
         lock (availableTaggers)
         {
             if (availableTaggers.Count > 0)
             {
                 var index = availableTaggers.First();
                 availableTaggers.Remove(index);
                 return(taggers[index]);
             }
             else if (taggers.Count < maxTaggerNum)
             {
                 if (availableTaggers.Count == 0)
                 {
                     var tagger = new PosTagger();
                     taggers.Add(tagger);
                     return(tagger);
                 }
                 else
                 {
                     var index = availableTaggers.First();
                     availableTaggers.Remove(index);
                     return(taggers[index]);
                 }
             }
         }
         {
             while (availableTaggers.Count == 0)
             {
                 Thread.Sleep(10);
             }
             var index = availableTaggers.First();
             availableTaggers.Remove(index);
             return(taggers[index]);
         }
     }
 }