WPF多线程刷新界面控件1

这里不做结论性的总结,只写一个自己所用的解决方案。

主界面事件 --> 去子线程处理 --> 子线程处理完毕请求刷新界面线程的事件堆入界面线程的event queue里面。

<pre class="html" name="code">

namespace IXO_SYSTEM_V1._0
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private delegate void NewThreadDelegate();
        private delegate void UpdateDelegate();
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btn_LuaTest_Click(object sender, RoutedEventArgs e)
        {
            // ThreadPool
           ThreadPool.QueueUserWorkItem(new WaitCallback(PrintTest));

            // use delegate
            //NewThreadDelegate dd = new NewThreadDelegate(PrintTest);
            //dd.BeginInvoke(null, null);
        }

        private void PrintTest(object state)
        {
            Thread.Sleep(5000);
            // UI thread dispatch the event into the event queue Async
            this.Dispatcher.BeginInvoke(new UpdateDelegate(UIUpdate));

        }

        private void UIUpdate()
        {
            tb_LuaTest.Text = "Hello";
           
        }


    }
}


在界面事件触发函数里面,使用线程池threadpool或者delegate都是可以添加一个新的线程的。

然后在其调用的函数中执行消耗时间或者计算量的程序,然后把结果更新给界面线程。

此时需要发送一个事件响应函数给界面线程,使用界面的对象this,分派一个事件this.Dispatcher,并且是异步执行this.Dispatcher.BeginInvoke,里面包含一个委托给到对应的界面更新的函数中.


展开阅读全文

没有更多推荐了,返回首页