C# 线程 和 委托的使用

低调的感觉 2013-08-22 01:33:00
1、新建一个Form:FrmLoading(等待提示信息),在此窗体内有个Lable(LabMsg:显示提示信息)
2、当我在另一个窗体(FrmUser)里点击保存时,我是想显示FrmLoading,保存执行完成后,关闭FrmLoading

以下是我的代码

//////////////////////////////////////////////////////////////
FrmLoading:只有构造函数:
public FrmLoading()
{
//防止多线程操作Lable时报错
Control.CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}
//////////////////////////////////////////////////////////////
FrmUser:
private FrmLoading _FrmLoading;
private Thread _ThreadLoading = null;
public string _LoadingMsg = string.Empty;
/// <summary>
/// 显示等待提示
/// </summary>
public void LoadingShow()
{
_ThreadLoading = new Thread(new System.Threading.ThreadStart(Loading));
_ThreadLoading.Start();
}
/// <summary>
/// 处理等待提示
/// </summary>
private void Loading()
{
if (string.IsNullOrEmpty(_LoadingMsg))
{
_LoadingMsg = "正在处理,请等待结果显示...";
}
_FrmLoading = new FrmLoading();
_FrmLoading.labelMsg.Text = _LoadingMsg;
_FrmLoading.ShowDialog();
}
/// <summary>
/// 关闭等待提示
/// </summary>
public void LoadingClose()
{
if (_FrmLoading != null)
{
_LoadingMsg = string.Empty;
_FrmLoading.Dispose();
if (_ThreadLoading != null)
{
_ThreadLoading.Abort();
_ThreadLoading = null;
}
}
}
//////////////////////////////////////////////////////////////
调用方式:
LoadingShow()
//执行操作...
LoadingClose()
//////////////////////////////////////////////////////////////


我是这么使用线程的,但是经常报一些异常,有时等待窗体也关闭不了,但是大多情况都是好的,调试的时候也是好的
在网上寻找了下答案,貌似用委托可以解决

请高人帮我解决一下!!!谢谢!!!
...全文
214 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
低调的感觉 2013-08-22
  • 打赏
  • 举报
回复
引用 5 楼 sjyforg 的回复:

FrmLoading f = new FrmLoading();
BackgroundWorker w = new BackgroundWorker();
w.DoWork += (o, e) => { //执行操作... };
w.RunWorkerCompleted += (o, e) => { f.Close(); };
w.RunWorkerAsync();
f.ShowDialog();
建议LZ把执行操作的程序放在另外的线程上,等完成之后再关闭Form。
这个 显示/关闭 等待效果,我是需要做成公共的方法,这么写的话就无法重用了!
申江渔夫 2013-08-22
  • 打赏
  • 举报
回复

FrmLoading f = new FrmLoading();
BackgroundWorker w = new BackgroundWorker();
w.DoWork += (o, e) => { //执行操作... };
w.RunWorkerCompleted += (o, e) => { f.Close(); };
w.RunWorkerAsync();
f.ShowDialog();
建议LZ把执行操作的程序放在另外的线程上,等完成之后再关闭Form。
低调的感觉 2013-08-22
  • 打赏
  • 举报
回复
引用 3 楼 bdmh 的回复:
一个流程也可以,设置topmost,点击保存时,显示窗体 另外尽量不要在线程外处理线程内部new的实例最好处理完时,让线程结束,线程自己销毁new的窗体
另外尽量不要在线程外处理线程内部new的实例最好处理完时,让线程结束,线程自己销毁new的窗体 请问如何实现??
bdmh 2013-08-22
  • 打赏
  • 举报
回复
一个流程也可以,设置topmost,点击保存时,显示窗体 另外尽量不要在线程外处理线程内部new的实例最好处理完时,让线程结束,线程自己销毁new的窗体
低调的感觉 2013-08-22
  • 打赏
  • 举报
回复
引用 1 楼 Return_false 的回复:
一个流程下来的操作,应该没有必要再去开一个线程.
由于等待的时间可能需要10秒左右,如果不新开辟一个线程,可能会造成程序假死
  • 打赏
  • 举报
回复
一个流程下来的操作,应该没有必要再去开一个线程.

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧