English 中文(简体)
执行ThreadPool的正确方式。 登记册 WaitForSingle 目的
原标题:The correct way to implement ThreadPool.RegisterWaitForSingleObject

我正试图使用ThreadPool。 登记册 WaitForSingle 目的是为一套深层添加一个时间。 我制造了9个read子,正试图给他们每个人提供同等的操作机会,因为如果我只把他们补充到read子中的话,那么现在似乎会发生一场小的饥荒。 我也试图开展一次人工复发活动,因为我希望所有9个路面都能够在继续之前撤出。

最好的办法是,确保read水池的每一条read子都获得同等的运行机会,因为我所说的功能是空洞的,而且似乎每个read(或每只管一胎)都 st在水中,而其他.则没有机会运行。

resetEvents = new ManualResetEvent[table_seats]; 
            //Spawn 9 threads
            for (int i = 0; i < table_seats; i++)
            {
                resetEvents[i] = new ManualResetEvent(false);
                //AutoResetEvent ev = new AutoResetEvent(false);
                RegisteredWaitHandle handle = ThreadPool.RegisterWaitForSingleObject(autoEvent, ObserveSeat, (object)i, 100, false);
            }

            //wait for threads to exit
            WaitHandle.WaitAll(resetEvents);

然而,如果我使用复发或提夫似乎都没有适当工作,那就没有问题了。 我能够执行这一或我(可能)误解他们应如何工作。

感谢R。

最佳回答

我不使用<代码>RegisterWaitForSingle 为此的目标。 我在此要描述的模式需要。 自您使用NET诉3.5以来下载。

首先,等待<代码>ThreadPool/code>的所有工作项目填写CountdownEvent。 这比使用多个<代码>ManualResetEvent的事例要多得多,而且可以衡量。 +, The WaitHandle. WaitAll方法限于64种。

var finished = new CountdownEvent(1);
for (int i = 0; i < table_seats; i++)
{
  finished.AddCount();
  ThreadPool.QueueUserWorkItem(ObserveSeat);
    (state) =>
    {
      try
      {
        ObserveSeat(state);
      }
      finally
      {
        finished.Signal();
      }
    }, i);
}
finished.Signal();
finished.Wait();

其次,你可以在多个路段的传导之后尝试使用<条码>Thread.Sleep(0),以便迫使环境转变,使目前的胎面能够向另一个人产生。 如果您希望制定一项更为复杂的协调战略,则使用<条码>Barrier<>/条码>。 在您的<代码>ObserveSeat功能中添加另一个参数,接受这一同步机制。 你们可以通过在上述法典中体现《玛尔布达》的表述中加以提供。

public void ObserveSeat(object state, Barrier barrier)
{
  barrier.AddParticipant();
  try
  {
    for (int i = 0; i < NUM_ITERATIONS; i++)
    {
      if (i % AMOUNT == 0)
      {
        // Let the other threads know we are done with this phase and wait
        // for them to catch up.
        barrier.SignalAndWait();
      }
      // Perform your work here.
    }
  }
  finally
  {
    barrier.RemoveParticipant();
  }
}

指出,尽管这一办法肯定会防止饥饿问题,但它可能限制read子的穿透。 电话SignalAndWait可能过多地造成大量不必要的环境变化,但称这种变化不大可能造成许多不必要的等待。 也许必须调整<条码>AMOUNT,以便取得最佳的通过量和饥饿平衡。 我怀疑,可以采取简单的方式,积极进行这一研究。

问题回答

暂无回答




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签