私が対処している方法は、以前のバージョンから適応させたヘルパー クラスを使用することです。基本的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Windows.UI.Core;
using Windows.UI.Xaml;
namespace JTModelsWinStore.Local
{
public delegate void UseDataDelegate(DataCoordinator data);
public delegate bool GetDataDelegate(DataCoordinator data);
public class DataCoordinator
{
public DependencyObject Consumer;
public GetDataDelegate GetDataFunction;
public UseDataDelegate UseDataFunction;
public bool GetDataSucceeded;
public Exception ErrorException;
public string ErrorMessage;
public DataCoordinator(
DependencyObject consumer,
GetDataDelegate getDataFunction,
UseDataDelegate useDataFunction)
{
Consumer = consumer;
GetDataFunction = getDataFunction;
UseDataFunction = useDataFunction;
GetDataSucceeded = false;
ErrorException = null;
ErrorMessage = null;
}
public Task GetDataAsync()
{
GetDataSucceeded = false;
Task task = Task.Factory.StartNew(() =>
{
if (GetDataFunction != null)
{
try
{
GetDataSucceeded = GetDataFunction(this);
}
catch (Exception exception)
{
GetDataSucceeded = false;
ErrorException = exception;
ErrorMessage = exception.Message;
}
}
if (UseDataFunction != null)
{
if (Consumer != null)
{
var ignored = Consumer.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
UseDataFunction(this);
});
}
else
UseDataFunction(this);
}
});
return task;
}
}
}
次に、Windows ストア コードで:
private async void ItemView_ItemClick(object sender, ItemClickEventArgs e)
{
DataCoordinator data = new DataCoordinator(this, Logon, LogonCompleted);
await data.GetDataAsync();
}
private bool Logon(DataCoordinator data)
{
LoggedOnUserID = ServiceClient.LogOn(UserName, Password);
if (LoggedOnUserID == null)
{
UserName = "AnonymousUser";
Password = "";
if (!String.IsNullOrEmpty(ServiceClient.ErrorMessage))
data.ErrorMessage = "Log on failed.";
return false;
}
if (!String.IsNullOrEmpty(ServiceClient.ErrorMessage))
{
data.ErrorMessage = ServiceClient.ErrorMessage;
return false;
}
return true;
}
private void LogonCompleted(DataCoordinator data)
{
if (data.GetDataSucceeded && LoggedOnUserID != null)
pageTitle.Text = "Logged On";
else
pageTitle.Text = "LogOn Failed";
}
ヘルパーに 2 つの関数を提供します。1 つはデータを取得するため (低速)、もう 1 つは UI でデータを処理するためです。ネストされた 2 つのラムダで実行できることはわかっていますが、2 つのラムダを非表示にするのが好きです。これは、私のようなベテランにとってより快適です。
私自身だけでなく他の人の利益のためにも、お気軽に批評してください。