如何在不知道要加入的子线程中模拟连接语句

时间:2014-07-17 20:59:23

标签: c# multithreading join

我有三个主题:

  • 主要
  • 线程1
  • 线程2

步骤进行:

  1. 主要主题开始 thread1
  2. 主要主题开始 thread2
  3. thread1 应加入 thread2
  4. 如何在不使用加入/暂停和恢复的情况下执行此操作。

    PS: thread1 不应该知道 thread2 的存在。

    我是使用暂停和恢复做的,而且效果很好,但我的老板并不接受这个解决方案。

    这段代码只是为了有个主意。这不是真正的代码。

    public class Program
    {
        static void Main(string[] args)
        {
            Thread thread1 = new Thread(() => Thread1Work());
            Thread thread2 = new Thread(() => Thread2Work());
            Thread thread3 = new Thread(() => StartWork(thread1, thread2));
    
            thread3.Start();
    
            if(CloseProgram())
            {
                thread2.Abort();
            }           
        }
    
        public static bool CloseProgram()
        {
            Stopwatch sw = new Stopwatch();
            while (true)
            {
                sw.Start();
                while (!EndProgram() && sw.ElapsedMilliseconds < 60000){ }
    
                if (sw.ElapsedMilliseconds > 60000)
                {
                    sw.Stop();
                    return false;
                }
                else
                {
                    sw.Stop();
                    return true;
                }
            }
        }
    
        public static void StartWork(Thread thread1, Thread thread2)
        {
            thread2.Start();
    
            thread1.Start();
    
            thread2.Suspend();
    
            while (thread2.IsAlive) { }
    
            thread1.Join();
    
            thread2.Resume();
    
            while (!thread2.IsAlive) { }
    
            thread2.Join();
        }
    
        public static void Thread2Work()
        {
            while(true){ DoSomething(); }
        }
    
        public static bool EndProgram()
        {
            if(someThing())
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    
        public static void Thread1Work()
        {
            DoOtherThing();
        }
    }
    

2 个答案:

答案 0 :(得分:0)

我假设您可以更改在两个线程上运行的代码。

您可以将信号量传递给线程1和2,并让线程1调用WaitOne,而线程2最后调用Release。

答案 1 :(得分:0)

使用任务最有可能更好地处理。

将工作分解为离散单位,等待两个第一单元完成,然后使用ContinueWith方法有效地加入工作。

或者,生产者消费者模式可能更合适,在这种情况下,我建议查看BlockingCollection类来调解线程之间的通信。

然而,为了能够提供更详细的答案,问题中的更多细节对于您要实现的目标将是有用的。