首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 线程 跟 委托的使用

2013-09-05 
C# 线程 和 委托的使用本帖最后由 loveyang7733 于 2013-08-22 13:33:56 编辑1、新建一个Form:FrmLoading(

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。

热点排行