ThreadPool.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //
  2. // System.Threading.ThreadPool
  3. //
  4. // Author:
  5. // Patrik Torstensson
  6. // Dick Porter ([email protected])
  7. // Maurer Dietmar ([email protected])
  8. //
  9. // (C) Ximian, Inc. http://www.ximian.com
  10. //
  11. using System;
  12. using System.Collections;
  13. using System.Runtime.CompilerServices;
  14. namespace System.Threading {
  15. public sealed class ThreadPool {
  16. private ThreadPool ()
  17. {
  18. /* nothing to do */
  19. }
  20. [MethodImplAttribute(MethodImplOptions.InternalCall)]
  21. static extern bool BindHandleInternal (IntPtr osHandle);
  22. public static bool BindHandle (IntPtr osHandle)
  23. {
  24. return BindHandleInternal (osHandle);
  25. }
  26. [MethodImplAttribute(MethodImplOptions.InternalCall)]
  27. public static extern void GetAvailableThreads (out int workerThreads, out int completionPortThreads);
  28. [MethodImplAttribute(MethodImplOptions.InternalCall)]
  29. public static extern void GetMaxThreads (out int workerThreads, out int completionPortThreads);
  30. public static bool QueueUserWorkItem (WaitCallback callback)
  31. {
  32. IAsyncResult ar = callback.BeginInvoke (null, null, null);
  33. if (ar == null)
  34. return false;
  35. return true;
  36. }
  37. public static bool QueueUserWorkItem (WaitCallback callback, object state)
  38. {
  39. IAsyncResult ar = callback.BeginInvoke (state, null, null);
  40. if (ar == null)
  41. return false;
  42. return true;
  43. }
  44. public static RegisteredWaitHandle RegisterWaitForSingleObject (WaitHandle waitObject,
  45. WaitOrTimerCallback callBack,
  46. object state,
  47. int millisecondsTimeOutInterval,
  48. bool executeOnlyOnce)
  49. {
  50. return RegisterWaitForSingleObject (waitObject, callBack, state,
  51. (long) millisecondsTimeOutInterval, executeOnlyOnce);
  52. }
  53. public static RegisteredWaitHandle RegisterWaitForSingleObject (WaitHandle waitObject,
  54. WaitOrTimerCallback callBack,
  55. object state,
  56. long millisecondsTimeOutInterval,
  57. bool executeOnlyOnce)
  58. {
  59. if (millisecondsTimeOutInterval < -1)
  60. throw new ArgumentOutOfRangeException ("timeout", "timeout < -1");
  61. if (millisecondsTimeOutInterval > Int32.MaxValue)
  62. throw new NotSupportedException ("Timeout is too big. Maximum is Int32.MaxValue");
  63. TimeSpan timeout = new TimeSpan (0, 0, 0, 0, (int) millisecondsTimeOutInterval);
  64. RegisteredWaitHandle waiter = new RegisteredWaitHandle (waitObject, callBack, state,
  65. timeout, executeOnlyOnce);
  66. QueueUserWorkItem (new WaitCallback (waiter.Wait), null);
  67. return waiter;
  68. }
  69. public static RegisteredWaitHandle RegisterWaitForSingleObject (WaitHandle waitObject,
  70. WaitOrTimerCallback callBack,
  71. object state,
  72. TimeSpan timeout,
  73. bool executeOnlyOnce)
  74. {
  75. return RegisterWaitForSingleObject (waitObject, callBack, state,
  76. (long) timeout.TotalMilliseconds, executeOnlyOnce);
  77. }
  78. [CLSCompliant(false)]
  79. public static RegisteredWaitHandle RegisterWaitForSingleObject (WaitHandle waitObject,
  80. WaitOrTimerCallback callBack,
  81. object state,
  82. uint millisecondsTimeOutInterval,
  83. bool executeOnlyOnce)
  84. {
  85. return RegisterWaitForSingleObject (waitObject, callBack, state,
  86. (long) millisecondsTimeOutInterval, executeOnlyOnce);
  87. }
  88. public static bool UnsafeQueueUserWorkItem (WaitCallback callback, object state)
  89. {
  90. IAsyncResult ar = callback.BeginInvoke (state, null, null);
  91. if (ar == null)
  92. return false;
  93. return true;
  94. }
  95. }
  96. }