2011-07-08 24 views
1

这是一些永久生成GUID的代码。我已经写了它来了解线程。其中你会注意到,即使ConcurrentQueue是线程安全的,我也会在其中生成GUID并将其排入队列。这是因为我的实际代码需要使用NHibernate,所以我必须确保只有一个线程能够填充队列。为什么这个过程失去了线程?

虽然我在任务管理器中监视此代码,但我注意到该进程将线程数从18(在我的机器上)减少到了14,但是没有减少。这是因为我的代码不好?

也可以有人重构这个,如果他们觉得合适吗?我喜欢较短的代码。

class Program 
{ 
    ConcurrentNewsBreaker Breaker; 

    static void Main(string[] args) 
    { 
     new Program().Execute(); 

     Console.Read(); 
    } 

    public void Execute() 
    { 
     Breaker = new ConcurrentNewsBreaker(); 
     QueueSome(); 
    } 

    public void QueueSome() 
    { 
     ThreadPool.QueueUserWorkItem(DoExecute); 
    } 

    public void DoExecute(Object State) 
    { 
     String Id = Breaker.Pop(); 
     Console.WriteLine(String.Format("- {0} {1}", Thread.CurrentThread.ManagedThreadId, Breaker.Pop())); 

     if (Breaker.Any()) 
      QueueSome(); 
     else 
      Console.WriteLine(String.Format("- {0} XXXX ", Thread.CurrentThread.ManagedThreadId));    
    } 
} 


public class ConcurrentNewsBreaker 
{ 
    static readonly Object LockObject = new Object(); 

    ConcurrentQueue<String> Store = new ConcurrentQueue<String>(); 

    public String Pop() 
    { 
     String Result = null; 
     if (Any()) 
      Store.TryDequeue(out Result); 
     return Result; 
    } 

    public Boolean Any() 
    { 
     if (!Store.Any()) 
     { 
      Task FillTask = new Task(FillupTheQueue, Store); 
      FillTask.Start(); 
      FillTask.Wait(); 
     } 

     return Store.Any(); 
    } 

    private void FillupTheQueue(Object StoreObject) 
    { 
     ConcurrentQueue<String> Store = StoreObject as ConcurrentQueue<String>; 
     lock(LockObject) 
     { 
      for(Int32 i = 0; i < 100; i++) 
       Store.Enqueue(Guid.NewGuid().ToString());    
     } 
    } 
} 
+0

我的电脑有2个内核。有没有办法告诉ThreadPool需要多少线程专门用于我的进程? – Roman

+1

你有多少个核心?如何使用更多的线程在这里帮助?注意你的锁意味着一次只有一个线程可以有用...... –

+0

@Am - 线程永远不会“专用于进程”。线程*是*每进程。 –

回答

2

您正在使用.NET的ThreadPool,因此.NET/Windows根据等待处理的工作量管理线程数。

+0

除了使用int而不是Int32之类的小事之外,我没有看到任何重要的区域要切断。对不起 –

+0

好吧,我很高兴你这么认为。谢谢:) – Roman

1

虽然我监视任务 经理这个代码,我注意到进程下降 线程从18数(我 机器)14却毫不逊色。这是 ,因为我的代码不好?

这并不表示问题。 14仍然很高,除非你有一个16核心的CPU。

线程池将尝试用尽可能少的线程进行调整和完成工作。

你应该开始担心线程的数量会大大增加up

+0

你提出了一个很好的观点 – Roman

相关问题