如何确保在释放后续信号量之前不会释放信号量?

时间:2011-06-30 11:50:23

标签: .net c#-3.0

我的应用程序从实时Feed中提取数据,而且一次只能对实时Feed进行一次调用。我将foreach称为大约20个场景,然后对于每个场景我都要将实时源调用15次。

我对线程有点陌生,经过互联网和阅读后,我终于决定使用信号量。但我无法找到一种方法来保持信号量(场景的_pool)的第一个等待,直到为该特定场景调用实时源15次。

如果对这个问题有一个更优雅的解决方案(我确信有),我会很感激 提前谢谢。

    private void button1_Click(object sender, EventArgs e)
    {
        _pool = new Semaphore(0, 1);
        foreach (string s in str)
        {
            Thread n = new Thread(new ParameterizedThreadStart(method1));
            n.Start(venue);            
        }
        _pool.Release(1);

    }


    static void method1(object venue)
    {
        _pool.WaitOne();

        for (int i = 1; i <= numThreads; i++)
        {
            string composite = i.ToString() + "," + venue;
            Thread n = new Thread(new ParameterizedThreadStart(method2));
            n.Start(composite);
        }
        _pool.Release(); //I need to ensure that this is called only after all threads
                         // spawned in the for loop corresponding to foreach thread are
                         // executed. But how?  
    }

    static void method2(object i)
    {
        _pool2.WaitOne();

        //Call to data engine and storing data in txt file

         Thread.Sleep(100);

         _pool2.Release();


    }

1 个答案:

答案 0 :(得分:0)

拥有主线程 P )或某个工作线程( W ),这反过来会产生一个或多个额外的线程(< strong> AT )只有 P W 等到所有 AT 完成不是线程的最佳使用。在场景 P 中,您也可以直接调用 method2 (),因为 P 会被阻止,直到 AT 完成。情况 W 也是如此。

WaitAll ()或等待事件是另一种方式,但也许是因为它强制调用者阻止。这样的模式不能很好地扩展,并且当它可以做其他事情时会浪费一个线程。

另一种方法是使用异步通知线程编组来在每个线程退出时警告主线程(或父线程)。因为您的应用程序是一个GUI,您可以使用.NET的 Control.Invoke ()或 Control.BeginInvoke ()。从你的工作线程中,只需调用 myForm.BeginInvoke (...)来提醒 myForm 中的一个方法你的线程刚刚退出并且在那里处理了所有新的任务管理比其他一些中间线程 W

调用()和 BeginInvoke ()之间存在一些重要差异。 调用()阻止工作线程,同时将调用编组到UI线程,并且在后者完成之前不会返回。所以在这种情况下使用它可能不是一个好主意。

BeginInvoke ()通过 Windows消息泵异步调用UI线程中的方法。您的工作线程被阻止。这是最好的选择。