是这样的:
点主界面的一个按钮,会有个下载,比如说下载的方法是DownLoad(),下载是在另一个线程里.
但是下载的方法里还有个事件
DownLoad()
{
   .
   .//下载的代码
   .
   Complete(); //事件Complete,用于下载完成后触发另一个方法的,这个方法是UI类里
}
我想问的是,DownLoad()是在另一个线程里执行的,DownLoad()也是在UI类里的,那么事件触发后委托给事件的方法执行是在下载的线程里还是在UI线程里呢?
如果是在下载线程里,那么有没有办法让这个方法在UI线程里执行呢?
急死了.谢谢大家.

解决方案 »

  1.   

    >>>我想问的是,DownLoad()是在另一个线程里执行的,DownLoad()也是在UI类里的,>>>那么事件触发后委托给事件的方法执行是在下载的线程里还是在UI线程里呢?应该是在原来的线程里,如果你需要想在UI线程执行的话,用个控件的Invoke方法,譬如,参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnforms/html/winforms08162002.asp
      

  2.   

    我不是想在UI线程里执行,只是Complete事件触发的方法里还会创建另一个窗体,如果是在另一个线程里的话窗体里控件的更新都得用Invoke方法更新了.而且我想知道如果在另一个线程里调用this.Close()方法的话会不会把UI线程一起给关闭了?
    另外我之所以在另一个线程里加一个事件就是因为那个线程完之后我还要执行一些必须在那个线程完OVER后才能执行的方法,不知道有没有别的办法可以不用事件而使我知道线程结束并执行这些方法?难道得不停的查询线程状态或者用EndInvoke(线程是用BeginInvok())?
    请指教...
      

  3.   

    注意,在windows里,消息是基于线程的,如果你要在另一个线程里创建窗口/处理消息的话,需要在那个线程上运行message loop: Application.Run(...)
      

  4.   

    >>>是我需要的是另一个线程执行完后可以返回主线程,如何做啊.就是说主线程知道另一个线程执行完后再执行下一个方法既然要等,为什么要用另一个线程?在当前GUI线程上执行就是了建议你采用类似ManualResetEvent的东西来同步化
      

  5.   

    可是我还得在自己的UI界面上更新进度栏和别的东西啊.下载必须得在别的进程里下载才可以的.ManualResetEvent是怎么用的?有没有例子可以搞来看下的?
    我的电邮是[email protected]
      

  6.   

    >>>可是我还得在自己的UI界面上更新进度栏和别的东西啊.下载必须得在别的进程里下载才可以的.like I said above, use control's Invoke or BeginInvoke, see the above link by Chris Sells
    >>>ManualResetEvent是怎么用的?有没有例子可以搞来看下的?http://www.codeproject.com/csharp/workerthread.asphttp://www.codeproject.com/csharp/eventsthreadsync.asp