La façon dont je m'adresse est d'utiliser une classe d'aide que j'ai adaptée à partir d'une version précédente. En gros:
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;
}
}
}
puis dans le code de Windows Store:
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";
}
Je fournis l'aide de deux fonctions, l'une pour obtenir les données (lent), et un pour faire quelque chose avec les données l'interface utilisateur. Je sais que je pourrais le faire dans deux lambdas imbriqués, mais j'aime cacher les deux lambdas, ce qui est plus confortable pour un ancien comme moi.
N'hésitez pas à le critiquer, pour le bénéfice des autres comme pour le mien.
Quelle est la programmation OOB? Est-ce la version d'OOP d'un homme pauvre? –
Quoi qu'il en soit, la nouvelle méthode asynchrone ne change rien; Vous pouvez toujours utiliser votre bibliothèque telle quelle, en particulier si aucun des appels ne dure plus de 50 ms. C'est la métrique de Microsoft, et seulement 10% de tous les appels dans leur cadre rencontrent cette métrique et sont donc écrits pour être asynchrones. Les 90% restants sont encore de bonnes méthodes synchrones ordinaires. –
Désolé, je voulais dire OOP. Le cerveau est assez frit après 15 heures de programmation. – jtsoftware