#region
using System;
using System.Threading;
using System.Windows.Forms;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
#endregion
namespace CSFrameworkV5.Library
{
///
/// 异步线程处理通用界面(异步操作等待窗体)
///
public partial class frmThreadOperating : frmBase
{
private static frmThreadOperating _Instance;
private static Thread _Thread;
private static Form _Owner;
private static object _Params; //MyThreadExecuting事件的参数
private static MyThreadExecuting _OnOperating;
private static MyThreadFinished _OnFinished;
private static MyThreadAborting _OnAborting;
//计时器读秒
private int _Secondes;
private frmThreadOperating()
{
InitializeComponent();
}
private void btnStop_Click(object sender, EventArgs e)
{
//若用户提供_OnAborting事件,在线程结束前,要通知该事件。
if (_OnAborting != null || _OnAborting())
{
if (_Thread != null) _Thread.Abort(); //结束线程
_Thread = null;
_Instance = null;
Close();
}
}
///
/// 关闭窗体
///
///
public static void CloseMe(Form owner)
{
if (_Instance != null)
try
{
_Instance.Hide();
_Instance.Close();
_Instance = null;
owner.Show();
GC.Collect();
}
catch
{
}
}
private void DoCloseMe()
{
Close();
_Instance = null;
}
private void frmThreadOperating_Load(object sender, EventArgs e)
{
//开始计时
_Secondes = 1;
timer1.Start();
//启动线程
_Thread = new Thread(OnThreadStart);
_Thread.Start();
}
private void frmWaitingThread_FormClosing(object sender,
FormClosingEventArgs e)
{
timer1.Stop();
labelControl1.Text = "系统正在中断线程.....";
Application.DoEvents();
if (_Thread != null && _Thread.ThreadState == ThreadState.Running)
{
if (Msg.AskQuestion("确定要取消操作吗?"))
{
//若用户提供_OnAborting事件,在线程结束前,要通知该事件。
if (_OnAborting != null || _OnAborting())
{
e.Cancel = false;
_Thread.Abort();
_Thread = null;
}
}
else
{
e.Cancel = true;
}
}
if (!e.Cancel)
{
_Instance = null;
_Thread = null;
GC.Collect();
}
}
private void OnThreadStart()
{
object result = null;
try
{
//开始操作,比如查询大数据、批量处理大数据
result = _OnOperating(_Params);
//关闭当前窗体
if (_Instance != null)
_Instance.Invoke(new MyThreadClose(_Instance.DoCloseMe));
//操作完成,异步通知用户已完成数据处理
if (_Owner != null && _OnFinished != null)
_Owner.Invoke(new MyThreadFinished(_OnFinished), result);
_Thread = null;
}
catch (Exception ex) //线程异常事件处理
{
//if (ex.Message != "正在中止线程。") Msg.ShowException(ex);
//线程结束事件
if (_OnFinished != null)
_Owner.Invoke(new MyThreadFinished(_OnFinished), result);
//关闭窗体
if (_Instance != null)
_Instance.Invoke(new MyThreadClose(_Instance.DoCloseMe));
_Thread = null;
}
}
///
/// 显示线程操作窗体
///
/// 父级窗体,打开线程操作窗体
/// 执行操作
/// 传入参数
/// 取消线程通知
/// 线程完成后回调事件
/// 设置窗体标题
public static void ShowMe(
Form owner,
MyThreadExecuting doSomething,
object parameters = null,
MyThreadAborting aborting = null,
MyThreadFinished finished = null,
string windowCaption = "")
{
if (_Instance == null)
{
_Owner = owner;
_OnOperating = doSomething;
_Params = parameters;
_OnFinished = finished;
_OnAborting = aborting;
_Instance = new frmThreadOperating();
_Instance.Text = windowCaption.IsNullOrEmpty()
? "异步操作等待窗体"
: windowCaption;
_Instance.ShowDialog(owner);
}
else
{
Msg.Warning("异步任务正在运行中,请完成此任务后再操作!");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
labelControl2.Text = "用时 " + _Secondes.ToStringEx() + " 秒";
_Secondes++;
}
#region 自定义委托类型
public delegate object MyThreadExecuting(object param);
public delegate void MyThreadFinished(object data);
public delegate bool MyThreadAborting(); //线程终止事件,必须返回True;
public delegate void MyThreadClose();
#endregion
}
}