我有三个主题:
步骤进行:
如何在不使用加入/暂停和恢复的情况下执行此操作。
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();
}
}
答案 0 :(得分:0)
我假设您可以更改在两个线程上运行的代码。
您可以将信号量传递给线程1和2,并让线程1调用WaitOne,而线程2最后调用Release。
答案 1 :(得分:0)
使用任务最有可能更好地处理。
将工作分解为离散单位,等待两个第一单元完成,然后使用ContinueWith方法有效地加入工作。
或者,生产者消费者模式可能更合适,在这种情况下,我建议查看BlockingCollection类来调解线程之间的通信。
然而,为了能够提供更详细的答案,问题中的更多细节对于您要实现的目标将是有用的。