基於介面和隊列的線程操作UI方式

來源:互聯網
上載者:User

    在實際開發應用中,非UI線程操作UI是普遍存在的,在.net下一般是通過Control.Invoke的方法來進行操作,但到處都是Control.Invoke代碼維護可是一件麻煩的事情。以下通過介面和隊列來規範非UI線程操UI的實現。

   既然要規範處理那介面是個不錯的選擇,以下定義一個簡單的執行介面

public interface IInvokeItem    {        void Execute();    }

  以下是擴充一個簡單的操作類封裝

class ControlInvoke<CONTROL,DATA> : IInvokeItem    {        public ControlInvoke(CONTROL control, DATA data, Action<CONTROL, DATA> action)        {            mControl = control;            mData = data;            mAction = action;        }        private CONTROL mControl;        private DATA mData;        private Action<CONTROL, DATA> mAction;        public void Execute()        {            mAction(mControl, mData);        }    }

  規則定好了,那接下來要做的事情就是寫一個簡單的隊列處理。

public class Dispatch    {        static Dispatch()        {            Instance = new Dispatch();        }        public void Add<CONTROL, DATA>(CONTROL control, DATA data, Action<CONTROL, DATA> action)        {            ControlInvoke<CONTROL, DATA> item = new ControlInvoke<CONTROL, DATA>(control, data, action);            Add(item);        }        private Queue<IInvokeItem> mQueues = new Queue<IInvokeItem>();        public static Dispatch Instance        {            get;            set;        }        public void Add(IInvokeItem item)        {            lock (this)            {                mQueues.Enqueue(item);            }        }        public void Execite()        {            lock (this)            {                while (mQueues.Count > 0)                {                    mQueues.Dequeue().Execute();                }            }        }    }

  一個簡單的調用規則就完成,接下來就是如果在winform下面用了;首先可以在介面定義一個timer,可以指定時間內執行Dispatch的工作。

private void timer1_Tick(object sender, EventArgs e)        {            ThreadInvoke.Dispatch.Instance.Execite();         }

  當需要線上程中操作UI只需要向ThreadInvoke.Dispatch添加item即可,對於它的執行是完全不用關心的。以下是起一個線程不停地向一個文字框添加一個GUID值

private void cmdTest_Click(object sender, EventArgs e)        {            System.Threading.ThreadPool.QueueUserWorkItem(OnTest);        }        private void OnTest(object state)        {            while (true)            {                ThreadInvoke.Dispatch.Instance.Add<RichTextBox, Guid>(                    richTextBox1, Guid.NewGuid(), (c, d) => {                        richTextBox1.AppendText(d.ToString("N"));                        richTextBox1.AppendText("\r\n");                    });                System.Threading.Thread.Sleep(10);            }        }

 這樣一個不使用Control.Invoke來實現非UI線程操作UI的方法就完成了.至於靈活性來說那就看你如何發揮IInvokeItem了:)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.