窗体上有个按钮,有一个进度条,我在点击按钮之后,开启了一个线程,线程里的方法是在logic层里,是对图片进行处理,比如说有20张图片,我开启线程之后,每次处理一张图片,处理完之后更新这张图片在数据库的状态。在窗体中有一个TIMER,每3秒取一下数据库,发现有几张图片的状态改变了,进度条的VALUE变成几。这个怎么实现? 是用委托么?我正常的情况下,线程开启了,TIMER就不走,什么时候线程走完了他才走。各位高手指教一下,刚学习C#

解决方案 »

  1.   

    除去主线程,每个子线程对应处理一张图片。这需要在主线程与子线程之间进行同步,并由子线程来更新主线程的UI。BeginInvoke()、EndInvoke()这几个函数是比较重要的。你可以先找找MSDN上关于线程同步和UI线程同步的内容。我以前也翻译过一篇MSDN Magazine上的文章,其中提到的同步方法,我至今仍在使用。链接如下:
    http://www.vckbase.com/document/viewdoc/?id=1126
    http://blog.vckbase.com/abbey/articles/213.html
      

  2.   

    给logic定义一个委托事件,然后Form调用logic中的方法并实现logic中的委托,
    logic的委托的实现代码就是控制界面的进度效果。。
      

  3.   

    为什么我一开启线程,我的TIMER就不走了呢???
      

  4.   

    new Thread((ThreadStart)delegate
    {
         // you code
         Control.Invoke((MethodInvoker)delegate
         {
         
         })
    }).Start();
      

  5.   


    #region -定义一个输出委托    /// <summary>
        /// 定义一个输出委托
        /// </summary>
        /// <param name="strOutInfo"></param>
        public delegate void DebugOutMenuEvent(string strOutInfo);    #endregion#region -定义一个输出委托        /// <summary>
            /// 定义一个输出委托
            /// </summary>
            public event DebugOutMenuEvent DebugOutHandler;        #endregionpublic void Login()
    {
                if (this.loggedin)
                {
                    this.Close();
                }
                // 调用委托UI输出
                if (this.DebugOutHandler != null)
                {
                    this.DebugOutHandler("Opening connection to " + this.server);
                }            
    }在UI部分挂接这个委托,并编写实现代码,就像为按钮的click编写事件一样的。