原帖地址:
http://topic.csdn.net/u/20111108/09/07216bf6-d888-43c5-9192-87ffa4b4892c.html
public class Flag
{
public static bool IsOpen { set; get; }
public static object lockObj = new object();
}
public delegate void FunDelegate();
public delegate void SetValue(int i);
public delegate void CloseForm();
private void Form3_Load(object sender, EventArgs e)
{
Flag.IsOpen = true;
}
private void button1_Click(object sender, EventArgs e)
{
FunDelegate fundelegate = new FunDelegate(FunProc);
AsyncCallback callback = new AsyncCallback(CallBack);
IAsyncResult result = fundelegate.BeginInvoke(callback, "处理结束");
}
public void CallBack(IAsyncResult result)
{
MessageBox.Show(result.AsyncState.ToString());
}
public void FunProc()
{
for (int i = 0; i < 5000; i++)
{
Thread.Sleep(100);
if (Flag.IsOpen && this != null && !this.IsDisposed)
{
lock (Flag.lockObj)
{
if (Flag.IsOpen && this != null && !this.IsDisposed)
{
this.Invoke(new SetValue(SetListBox), i);
}
else
{
break;
}
}
}
else
{
break;
}
}
}
public void SetListBox(int i)
{
if (Flag.IsOpen && this != null && !this.IsDisposed)
{
listBox1.Items.Add(i);
}
}
private void Form3_FormClosing(object sender, FormClosingEventArgs e)
{
if (Flag.IsOpen)
{
Flag.IsOpen = false;
if (Monitor.TryEnter(Flag.lockObj, 2000))
{
Monitor.Exit(Flag.lockObj);
}
else
{
e.Cancel = true;
new Thread(() =>
{
Thread.Sleep(1000);
this.Invoke(new CloseForm(() => this.Close()));
}).Start();
}
}
}
详细过程晚上补.