上次去应聘,公司出了一题目.
是一线程问题,
让做一进度条,当打开一介面时,进行加载时出现.由于多线程学的不好,没有答好,请出手出招.
(当加载一特定介面时,一时打不开,请做一进度条,让用户知道正在加载而不是死机.请用C#做答.)

解决方案 »

  1.   

    比较简单的做法:
    做一个带progressBar的界面,把show新界面的load数据写成一个线程类,
    线程类要有progressBarForm的引用(或delegate,要不就invoke),
    然后thread.start();progressBarForm.showdialog();
    在线程方法结束时关闭dialog。
      

  2.   

    做一个带进度条的窗体,在主窗体里写个方法来创建它的实例并显示,然后创建线程类来启动它
    例如带进度条的窗体类为frmProgressBar
    声明引用 
    frmProgressBar objFrm = null;
    Thread thread = null;做个方法 
    ShowProgressBar()
    {
        objFrm = new frmProgressBar();
        objFrm.ShowDialog();
    }
    需要它显示的时候
    thread = new Thread(new ThreadStart(ShowProgressBar));
    thread.Start();记得该窗体关闭时一定要确保线程关闭
    if (thread.ThreadState == ThreadState.Running)
        thread.Abort();最好加Try块,然后在finally块中关闭它
      

  3.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace 进度条
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {        }        private void button1_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(new ThreadStart(Add));
                thread.Start();
            }        public delegate void ThredTask();        private void Add()
            {
                Form.CheckForIllegalCrossThreadCalls = false;   
                for (int m = 0; m < 100000; m++)
                {
                    this.label1.Text = m.ToString();
                    this.toolStripProgressBar1.Value = m/1000;
                }
            }        
        }
    }
      

  4.   

    Form.CheckForIllegalCrossThreadCalls = false;  
    没用委托,你试一下代码吧,这样做响应.只是不建议这么做!
      

  5.   

    虽然 没办法提供代码..但是记得在介绍AJAX 的书里提供过做 进度条的这个东西...呵呵 
      

  6.   

    似乎不能在新线程中ShowDialog,不然新线程结束了那个新窗口也被销毁了
      

  7.   

    一、进度条要放主线程执行,因为这涉及到UI
    二、如果加载工作可以报告进度(如中间有循环),一般不开线程,而在循环体内报告进度,处理消息(Application.DoEvents())刷新界面
    三、如果加载工作无法报告进度(如打开数据库、连接网络等),可以将该操作放到子线程中执行,完成后使用同步委托向主线程报告;主线程使用定时器更新进度条状态(伪装进度)。
      

  8.   

    主界面里启动工作线程,然后ShowDialog进度条窗口这样主界面就锁死了,工作线程负责设置进度条
      

  9.   

    http://blog.csdn.net/jinjazz/archive/2008/05/06/2397136.aspx
      

  10.   

    protected override void OnLoad(EventArgs e)
            {
                base.OnLoad(e);            Form2 f = new Form2();            Thread th = new Thread(new ThreadStart(delegate()
                {
                    f.ShowDialog();
                }));
                th.Start();            //数据加载过程
                int j = 0;
                for (int i = 0; i < 1000000000; i++)
                {
                    j++;
                }            th.Abort();
                Thread.Sleep(0);            if (f.InvokeRequired)
                {
                    Invoke(new MethodInvoker(delegate()
                    {
                        f.Close();
                    }));
                }
                else
                    f.Close();
            }
      

  11.   

    winform界面用backgroundworder这个控件就行