//--显示等待窗体
private void ShowWaitMess()
{
try
{
waitMess.ShowDialog();
}
catch( ThreadAbortException Err )
{
}
}
//--关闭等待窗体
private void CloseMess()
{
try
{
if( !waitMess.IsDisposed )
{
waitMess.Close() ;
}
}
catch( ThreadAbortException Err )
{
}
}//--新开辟一个线程调用
private void ShowMess( string TypeStr , string TypeTxt )
{
try
{
waitMess = new W_MessShow(TypeStr , TypeTxt );
Thread upgradeThread = null ;
upgradeThread = new Thread(new ThreadStart(ShowWaitMess));
upgradeThread.Start();
}
catch( ThreadAbortException Err )
{
}
}
//在主程序中调用
ShowMess("XMLDeal","正从XML文件中获取数据...");
ReadDataFormXML( string XMLPath , ref DataSet DS ) //需要花费几分钟
CloseMess();问题:
------------------------------------------------------
有时候出现控件成红色的"X",然后整个应用程序退出

解决方案 »

  1.   

    你可以使用异步显示一个等待窗体,参考代码如下:public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    //运行时间较长的函数的委托定义
    private delegate object someMethodDelegate(object someArg); //运行时间较长的函数
    private object someLongtimeMethod(object someArg)
    {
    //执行较长的操作
    return someArg;
    }
    private void button1_Click(object sender, EventArgs e)
    {
    //为调用函数而声明委托的实例
    someMethodDelegate sd = new someMethodDelegate(this.someLongtimeMethod);
    //开始调用函数,可以带参数
    IAsyncResult ir = sd.BeginInvoke("测试参数", null, null);
    //显示等待的窗口
    Form fWait = new Form();
    fWait.StartPosition = FormStartPosition.Manual;
    fWait.Location = this.button1.Location;
    fWait.Show(this);
    //刷新这个等待的窗口
    Application.DoEvents();
    //循环检测是否完成了异步的操作
    while (true)
    {
    if (ir.IsCompleted)
    {
    //完成了操作则关闭窗口
    fWait.Close();
    break;
    }
    }
    //取函数的返回值
    object retValue = sd.EndInvoke(ir);
    System.Console.WriteLine(retValue);
    }
    }
      

  2.   

    你要实现这个功能,完全可以不用线程。那个窗口不要ShowDialog,只要Show就可以了
      

  3.   


    /// <summary>
    /// 显示当前数据导入的进度条进度
    /// </summary>
    /// <param name="CurrentValue"></param>
    /// <param name="MaxValue"></param>
    private void ShowPress(int CurrentValue,int MaxValue,string Name)
    {
    this.DataprogressBar.Minimum = 0;
    this.DataprogressBar.Maximum = MaxValue; this.DataprogressBar.Value = CurrentValue;
    this.lb_PressTest.Text = "正在导入机构" + Name +"的数据..."; System.Threading.Thread.Sleep(100);
    }
      

  4.   

    或者你可以展示一个包含动态gif的窗体A 。在后台忙的代码中,加上A.UpDate()
      

  5.   

    update强制刷新一下 等待窗体 A
      

  6.   

    LZ,我看实现你这个功能不需要起一个新的线程来waitMess.ShowDialog(); 在主程序中一个简单的 waitMess.Show() 就可以,它显示的Modeless Form,不会阻塞后边的程序.再解释下你什么: 有时候出现控件成红色的"X",然后整个应用程序退出.这是因为你的waitMess是在非主线程的另外一个新产生的线程上生成的,但是却在主线程中去关闭它(主程序调用的CloseMess();). .NET的Form和它上边的控件有一个基本要求:对它们进行操作的线成必须是产生它们的那一个,如果不是的话,必须用Invoke或BeginInvoke去同步到那个线程上.
      

  7.   

    我上边说的"用Invoke或BeginInvoke去同步到那个线程上"可以这样做:private delegate void CloseFormDelegate();private void CloseMess()
    {
        if (waitMess.InvokeRequired)
            waitMess.Invoke(new CloseFormDelegate(DoCloseJob));
        else
            DoCloseJob();}private void DoCloseJob()
    {
        try
        {
            if (!waitMess.IsDisposed)
            {
                waitMess.Close();
            }
        }
        catch (ThreadAbortException Err)
        {
        }
    }
    这时候你的主程序再调用CloseMess就不回出现原来的问题,你可以试下.
      

  8.   

    可以肯定,必须使用多线程.原因很简单,等待窗口必须有进度条在滚动,而且也不能确定要滚动多久.谢谢RedGoldFish(红金鱼)
      

  9.   

    完美等待窗体参考我下载空间,完美的等待窗体,一行代码搞定。哈哈哈 
    自我吹嘘一下,非常简单 
    ││博客空间:http://blog.csdn.net/lovingkiss
    ││资源下载:http://download.csdn.net/user/lovingkiss
    ││Email:loving-kiss@163.com [MSN也是这个]
    ││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
    ╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤