2009-08-28 57 views
0

我有一个父线程(非UI),它创建一些子线程做一些工作,这些孩子来自不同的类(听起来很奇怪,但代码示例将说明它) - 在某些时候,父母必须等待某些任务由子线程完成 - 这并不意味着孩子已完成,但仅限于它已达到某个点,父母现在可以继续处理...class A在不同的类中等待Thread中的ManualResetEvent? [C#]

显然,这是一个示例我的情况......生活是不是这个简单的:) (抱歉转贴 - 试图添加为我以前的一个,但代码中的注释再也没有出来右)...

class A 
{ 
private ManualResetEvent manualResetEvent; 

public A() 
    { 
    manualResetEvent = new ManualResetEvent(false); 
    B child = new B(); 

    if (manualResetEvent;.WaitOne(1000, false)) 
     { 
     ... do the work I was waiting on ... 
     } 
    } 
}; 


Class B 
{ 
public B() 
    { 
    Thread childThread = new Thread(new ThreadStart(Manage)); 
    childThread.IsBackground = true; 
    childThread.Name = "NamedPipe Manager"; 
    childThread.Start(); 

    private void Manage() 
     { 
     ... do some work ... 
     ... call some functions ... 

     // SIGNAL TO Class A THAT IT CAN CONTINUE // 
     manualResetEvent.Set(); // this won't compile because obviously it has no clue what manualResetEvent is ... different class 

     ... do more work ... 
     ... call more functions ... 
     } 
    } 
}; 

正如你所看到的,这与之前有点不同......现在我们有两个不同的类(A & B) - 这个问题引发的问题是B无法看到A的manualResetEvent,因此无法通过Set来通知它。 ..

任何人有什么建议我如何能以线程安全的方式完成这项任务? 任何帮助将不胜感激。 谢谢,

回答

5

ManualResetEvent引用作为参数传递给B构造函数?

您也可以让B类创建自己的ManualResetEvent并通过属性公开它,但是如果所有B子线程必须共享相同的对象,则第一个选项将更可取。

0

我想说事件应该是B的财产而不是A,而A可以在child.Event.WaitOne()上等待。如果必须在A上有事件,则将其传递给B的构造函数,以便B保留对它的引用。

相关问题