windows 8開発-作業スレッドと更新UIを使う

3184 ワード

TheadPoolおよびCoreDisplatchを使用して、作業スレッドを使用してUIを更新する機能を実現することができる.
CoreDisplatchはUIスレッドで取得し、作業スレッドのcalback関数で使用しなければならない.さもないとCoreDisplatchは取得できません.
しかし、win 8では、The adPoolの代わりにTaskを使用することが推奨されており、作業スレッド内のタスクをキャンセルするなど、より実用的なインターフェースを提供している.
using System;
using System.Collections.Generic;
using System.IO;
using Windows.UI.Xaml;
using Windows.System.Threading;
using System.Threading.Tasks;
using Windows.UI.Core;
using Windows.Foundation;
//    HttpPostRequest
using MyProject.HttpPost;

namespace HttpTest
{
    /// <summary>
    ///         
    /// </summary>
    public class AccountServer
    {
        //     UI  
        private Window m_CurWindow;
        private CoreDispatcher m_CurCoreDispatcher;
        //         
        public EventHandler<LoginCompletedEventArgs> LoginCompleted;

        #region Constructor

        public AccountServer()
        {
            m_CurWindow = Window.Current;
        }

        #endregion

        #region Public Methods

        /// <summary>
        ///     
        /// </summary>
        /// <param name="userName">   </param>
        /// <param name="pwd">    </param>
        public void Login(string userName, string pwd)
        {           
            m_CurCoreDispatcher = m_CurWindow.Dispatcher;
            ThreadPool.RunAsync(AsyncRequestLogin);
        }

        #region Private Methods

        private HttpPostRequest HttpPostRequestInstance
        {
            get
            {
                if (null == m_HttpPostRequest)
                {
                    m_HttpPostRequest = new HttpPostRequest();
                }

                return m_HttpPostRequest;
            }
        }

        private void AsyncRequestLogin(object state)
        {
            HttpPostRequestInstance.AsyncRequest(LoginUrl, HttpPostParam.PrepareLoginParams(m_UserName, m_Pwd), AsyncLoginCallback);
        }

        private void AsyncLoginCallback(string msg)
        {           
            if (string.Empty == msg)
            {
                NotifyLoginCompletedEvent(new LoginCompletedEventArgs(false,false));
            }
            else
            {
                HttpPostResult res = new HttpPostResult(msg);
                long error = res.GetErrorCode();
                if (error == HttpPostResult.NoneError)
                {
                    Account account = res.GetAccount();
                    account.IsLogging = true;
                    account.Password = m_Pwd;
                    NotifyLoginCompletedEvent(new LoginCompletedEventArgs(true, account));
                }
                else
                {
                    NotifyLoginCompletedEvent(new LoginCompletedEventArgs(false));
                }
            }
        }

        private void NotifyLoginCompletedEvent(LoginCompletedEventArgs args)
        {
            m_CurCoreDispatcher.RunAsync(CoreDispatcherPriority.High,() =>
                {
                    if (LoginCompleted != null)
                        LoginCompleted(this, args);
                });
        }

        #endregion
    }
}