窗体主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public partial class frmWaitingNew : Form
   {
       public frmWaitingNew()
       {
           InitializeComponent();
       }
 
       private delegate void SetTextHandler(string text);
       public void SetText(string text)
       {
           if (this.lbl_UserMsg.InvokeRequired)
           {
               this.Invoke(new SetTextHandler(SetText), text);
           }
           else
           {
               this.lbl_UserMsg.Text = text;
           }
       }
 
       public bool IsShown = false;
       DateTime StarTime;
       private void frmWaitingNew_Shown(object sender, EventArgs e)
       {
           StarTime = ConvertEx.ToDateTimeEx("2014-06-15");
           timer1.Start();
           IsShown = true;
       }
 
       int RunSeconds = 0;
       private void timer1_Tick(object sender, EventArgs e)
       {
           txt_Time.Text = StarTime.AddSeconds(++RunSeconds).ToString("mm:ss");
       }
 
   }

等待窗体调用类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/// <summary>
   /// Using Singleton Design Pattern
   /// </summary>
   public class WaitFormService
   {
       public static void CreateWaitForm()
       {
           WaitFormService.Instance.CreateForm();
       }
 
       public static void CloseWaitForm()
       {
           WaitFormService.Instance.CloseForm();
       }
 
       public static void SetWaitFormCaption(string text)
       {
           WaitFormService.Instance.SetFormCaption(text);
       }
 
       private static WaitFormService _instance;
       private static readonly Object syncLock = new Object();
 
       public static WaitFormService Instance
       {
           get
           {
               if (WaitFormService._instance == null)
               {
                   lock (syncLock)
                   {
                       if (WaitFormService._instance == null)
                       {
                           WaitFormService._instance = new WaitFormService();
                       }
                   }
               }
               return WaitFormService._instance;
           }
       }
 
       private WaitFormService()
       {
       }
 
       private Thread waitThread;
       private frmWaitingNew waitForm;
 
       public void CreateForm()
       {
           try
           {
               if (waitThread != null)
               {
                   try
                   {
                       waitThread.Abort();
                       waitThread.Join();
                   }
                   catch (Exception)
                   {
                   }
               }
               while (waitThread != null && waitThread.ThreadState != ThreadState.Aborted)
                   Thread.Sleep(200);
 
               waitThread = new Thread(new ThreadStart(delegate()
               {
                   waitForm = new frmWaitingNew();
                   Application.Run(waitForm);
               }));
               waitThread.Start();
               ThreadWaite();
           }
           catch (Exception ex)
           {
               string sm = ex.Message;
           }
       }
 
       void ThreadWaite()
       {
           Thread.Sleep(200);
           if (!waitThread.IsAlive || waitForm == null || !waitForm.IsShown)
               Thread.Sleep(20);
 
       }
 
       public void CloseForm()
       {
           if (waitThread != null)
           {
               try
               {
                   //waitThread.Abort();
                   //就是在分页里面,不停的按下一页,下一页。Application.Run(waitForm);就会报错。使用下面代码
                   //waitForm.Close();
                   //waitForm.Dispose();
                   ThreadWaite();
                   waitForm.Invoke(new DClose(Close), null);
                   waitThread.Abort();
                   waitThread.Join();
                   waitThread.DisableComObjectEagerCleanup();
 
               }
               catch (Exception ex)
               {
                   Thread.Sleep(200);
                   ThreadWaite();
                   waitForm.Invoke(new DClose(Close), null);
                   waitThread.Abort();
                   waitThread.Join();
                   waitThread.DisableComObjectEagerCleanup();
               }
           }
       }
       public delegate void DClose();
 
       public void Close()
       {
           while ((int)waitForm.Handle < 0)
               Thread.Sleep(20);
           waitForm.Close();
       }
 
       public void SetFormCaption(string text)
       {
           if (waitForm != null)
           {
               try
               {
                   waitForm.SetText(text);
               }
               catch (Exception)
               {
               }
           }
       }
 
   }

Demo下载地址:http://pan.baidu.com/s/1pJ9HSRD

C#Winform之等待窗体的更多相关文章

  1. (二十三)c#Winform自定义控件-等待窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  2. 【C#】分享带等待窗体的任务执行器一枚

    -------------201504161039更新------------- 更新内容: IWaitForm接口删除System.Windows.Forms.DialogResult Dialog ...

  3. c# winForm 等待窗体的实现

    最近在做一个项目,需要用到等待窗体,在DevExpress下面有SplashScreen控件可以使用,同时也有ProgressIndicator控件能用,但是如果没有用Dev开发的话,我们就需要自定义 ...

  4. 【C#】带等待窗体的BackgroundWorker

    ---------------201504170911更新--------------- 更新内容:删除bgwUI新增的Start方法,改为通过new修饰符+可选参数的方式同时覆盖基类(Backgro ...

  5. C#中的“等待窗体”对话框

    这篇文章向您展示了如何在c#.net Windows窗体应用程序中创建一个等待窗体对话框.创建一个新表单,然后输入您的表单名称为frmWaitForm.接下来,将Label,Progress Bar控 ...

  6. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

  7. Devexpress 等待窗体

    加载窗体以及等待窗体 程序加载时,需要等待加载完成后在显示 窗体显示顺序 1. 给用户看的等待窗体 2. 加载完成后的主窗体 代码如下: 1. 等待窗体代码 #region using using S ...

  8. C#关于等待窗体(转)

    c#.net 中如果想在主窗口A里点击打开新窗口B(因为要数据库操作,Bload需一小段时间)之前弹出带有滚动条等待子窗口C来提示用户没有死机,应该怎么做?我用多线程打开了c窗口,但是问题:1.C窗口 ...

  9. WinForm中一个窗体调用另一个窗体

    [转] WinForm中一个窗体调用另一个窗体的控件和事件的方法(附带源码) //如果想打开一个 Form2 的窗体类,只需要: Form2 form = new Form2(); //有没有参数得看 ...

随机推荐

  1. <context:annotation-config/>、<context:component-scan/>

    在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredA ...

  2. [转载]Error -27796: Failed to connect to server

      原文地址:Error -27796: Failed to connect to server "test.shunde.gov.cn:80"作者:蓝小C 问题描述: 使用Loa ...

  3. Android开发过程中遇到的问题集合(—)

    1. Re-installation failed due to different application signatures. 将原来的软件包删除掉,然后又一次安装一次就好了.在命令行上执行:a ...

  4. mongoDB 索引的用法

    http://www.cnblogs.com/lipan/archive/2011/03/28/1997202.html MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的, ...

  5. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的

    bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...

  6. Quartus和ISE调用Synplify进行综合的问题

    分别尝试采用Quartus和ISE调用第三方综合软件Synplify进行综合. [软件版本] Quartus II 13.0 (SP).ISE 14.4 .Synplify 201303. [问题描述 ...

  7. 源代码分析:onAttach, onMeasure, onLayout, onDraw 的顺序。

    从前文<源代码解析:dialog, popupwindow, 和activity 的第一个view是怎么来的?>中知道了activity第一个view或者说根view或者说mDecorVi ...

  8. 安装Geo-IP

    安装指令例如以下所看到的,跟着步骤一步一步运行就可以.使用root权限,假设不是的话,请依据情况加上sudo权限命令. cd /tmp wget http://geolite.maxmind.com/ ...

  9. poj 2553 The Bottom of a Graph(强连通、缩点、出入度)

    题意:给出一个有向图G,寻找所有的sink点.“sink”的定义为:{v∈V|∀w∈V:(v→w)⇒(w→v)},对于一个点v,所有能到达的所有节点w,都能够回到v,这样的点v称为sink. 分析:由 ...

  10. hdu - 5033 - Building(单调栈)

    题意:N 幢楼排成一列(1<=N<=10^5),各楼有横坐标 xi(1<=xi<=10^7) 以及高度 hi(1<=hi<=10^7),在各楼之间的Q个位置(1&l ...