多线程操作一般是由主窗体启动子线程操作的.但在子窗体怎样刷新主窗体
的显示信息.问题就出在子线程怎样调用主线程中的对象方法以及保持主窗
体正确显示(单线程操作中有可能主窗体界面无法正常刷新).

在启动子线程构造函数中传递主窗体对象.在子线程需要调用主线程的方法
时使用Control.Invoke(System.Delegate method,Object[] args)即可解决.

下例为执行FTP下载的实例.代码精简如下:

 FrmDownload : System.Windows.Forms.Form
{
    //刷屏委托
    public delegate void RefreshScreenDelegate(string message);
    
//刷屏委托对象
    public RefreshScreenDelegate RefScreen = null;

   
/// <summary>
   
/// 构造函数,用动下载指定日期的数据
   
/// </summary>
   
/// <param name="downType">下载方式</param>
   public FrmDownload(FtpDownloader.DownloadType downType)
   {
        
//
        
// Windows 窗体设计器支持所必需的
        
//
        InitializeComponent();
        
//回调刷屏函数
        RefScreen = new RefreshScreenDelegate(this.RefreshScreen);
        
//回调更改下载按钮状态函数
        ChgBtnStatus = new ChangeBtnStatusDelegate(this.ChangeDownloadBtnStatus)
        
//保存下载类型
        this.downloadType = downType;
    }
    多线程中利用委托刷屏多线程中利用委托刷屏

    
/// <summary>
    
/// 下载Ftp数据文件
    
/// </summary>
    private void BtnDownload_Click(object sender, System.EventArgs e)
    {
         
try
         {
            
//数据下载线程
            downloader = new FtpDownloader(this,dtpDate.Value);
            
this.threadDownload = new System.Threading.Thread
            (
new  System.Threading.ThreadStart(downloader.Download));
            
this.threadDownload.IsBackground=true;

            
if (this.threadDownload.ThreadState != System.Threading.
           ThreadState.Running 
&& this.threadDownload.ThreadState
           
! =  System.Threading.ThreadState.Background)
           
this.threadDownload.Start();
       }
       
catch
       {
            
this.RefreshScreen("数据下载线程启动失败!");
            
return;
       }
  }

    
/// <summary>
    
/// 刷屏
    
/// </summary>
    
/// <param name="message">消息文本</param>
    public void RefreshScreen(string message)
    {
        txtScreen.Text 
+= message + "["+DateTime.Now.ToString()+"]\r\n";
    }
}



 
/// <summary>
 
/// FTP数据下载类
 
/// </summary>
 public class FtpDownloader
{
    
//Ftp操作类
    private FTPFactory ftpFactory = null;
    
//下载窗体
    private FrmDownload frmDownload = null;
    
/// <summary>
    
/// 构造函数
    
/// </summary>
    
/// <param name="f">下载窗体</param>
    
/// <param name="dt">下载数据日期</param>
    public FtpDownloader(FrmDownload f, DateTime dt)
    {
        
this.frmDownload = f;
    }

    
/// <summary>
    
/// 下载文件
    
/// </summary>
    
/// <returns></returns>
    public void Download()
    {
       
this.frmDownload.Invoke(frmDownload.RefScreen,new object[]{"数据下载线程已
       经成功启动!"});
    }
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-09
  • 2021-11-07
  • 2021-11-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-11
  • 2021-05-29
相关资源
相似解决方案