windows 8開発-作業スレッドと更新UIを使う
3184 ワード
TheadPoolおよびCoreDisplatchを使用して、作業スレッドを使用してUIを更新する機能を実現することができる.
CoreDisplatchはUIスレッドで取得し、作業スレッドのcalback関数で使用しなければならない.さもないとCoreDisplatchは取得できません.
しかし、win 8では、The adPoolの代わりにTaskを使用することが推奨されており、作業スレッド内のタスクをキャンセルするなど、より実用的なインターフェースを提供している.
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
}
}