多线程操作一般是由主窗体启动子线程操作的.但在子窗体怎样刷新主窗体
的显示信息.问题就出在子线程怎样调用主线程中的对象方法以及保持主窗
体正确显示(单线程操作中有可能主窗体界面无法正常刷新).
在启动子线程构造函数中传递主窗体对象.在子线程需要调用主线程的方法
时使用Control.Invoke(System.Delegate method,Object[] args)即可解决.
下例为执行FTP下载的实例.代码精简如下:
{
//刷屏委托
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[]{"数据下载线程已
经成功启动!"});
}
}