C# 线程 和 委托的使用
本帖最后由 loveyang7733 于 2013-08-22 13:33:56 编辑 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()
//////////////////////////////////////////////////////////////
我是这么使用线程的,但是经常报一些异常,有时等待窗体也关闭不了,但是大多情况都是好的,调试的时候也是好的
在网上寻找了下答案,貌似用委托可以解决
请高人帮我解决一下!!!谢谢!!!
C# 多线程 委托
[解决办法]
一个流程下来的操作,应该没有必要再去开一个线程.
[解决办法]
一个流程也可以,设置topmost,点击保存时,显示窗体
另外尽量不要在线程外处理线程内部new的实例最好处理完时,让线程结束,线程自己销毁new的窗体
[解决办法]
FrmLoading f = new FrmLoading();
BackgroundWorker w = new BackgroundWorker();
w.DoWork += (o, e) => { //执行操作... };
w.RunWorkerCompleted += (o, e) => { f.Close(); };
w.RunWorkerAsync();
f.ShowDialog();
建议LZ把执行操作的程序放在另外的线程上,等完成之后再关闭Form。