2011-11-16 42 views
0

我有一个类A,它有两个功能(“下载”和“查询”)。当“下载”功能完成时,它将触发“完成”事件。由于函数“query”将使用完成的“Download”函数的返回信息,我希望当函数“query”从A以外的类(例如,B类)被调用时,函数将等待执行,直到“Download “完成。 B类将无法识别A中正在等待“下载”完成的“查询”功能。换句话说,我不希望在B类的下载完成事件处理程序中调用“查询”函数。如何调用一个函数只能在一个事件在同一个类中完成后调用?

Class A 
    { 
     public Event finish; 

     public A() 
     { 
      Download(); 
     } 
     private void Download() 
     { 
      finish(this, new EventArgs()); 
     } 

     public void query() 
     { 
     } 
    } 

    Class B 
    { 
     A a = new A(); 
     a.query(); 
    } 

感谢,

回答

1

您必须同步方法下载和查询。因此,你可以使用AutoResetEvents

class A 
{ 
    AutoResetEvent are = new AutoResetEvent(false); 
    public void Download() 
    { 
     are.Reset(); 
     try 
     { 
      //Do your work here 
     } 
     finally 
     { 
      are.Set(); 
     } 
    } 
    public void Query() 
    { 
     are.WaitOne(); 
    } 

} 

这将持有每直到复位事件被设置进入该方法查询线程上。

但是,如果下载同步运行,则不必同步它们。由于A的构造函数是从B调用的,因此B在下载完成之前无法调用查询。

2

在查询中使用的BackgroundWorker用的RunWorkerAsync()方法。 执行bw.RunWorkerCompleted中的下载并在RunWorkerCompleted处理程序中启动事件。

相关问题