WinForm中异步刷新窗体

来源:互联网 发布:淘宝双十一前十一秒 编辑:程序博客网 时间:2024/06/17 22:19

原帖地址:

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();                }            }        }


 详细过程晚上补.

原创粉丝点击