Faire du sync avec de l'async
Bonjour,
Je travaille sur un PlugIn pour une application Web qui est codée en C# avec le Framework 4.8
J'ai besoin à un moment d'appeler une API REST pour récupérer des informations afin de compléter la saisie d'un utilisateur lorsqu'il enregistre ses données :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.XPath;
// Aurea.CRM libraries
using update.Lib.ComponentModel;
using update.Lib.Contracts.Services;
using update.Lib.Extensions;
using update.Web.Base.Extensions;
using update.Crm.Contracts.Events;
using update.Lib.Contracts.Events;
using update.Lib.Logging;
using System.Security.Policy;
using update.Crm.Core.Contracts;
using data = update.Crm.Contracts.Data;
using update.Crm.Extensions;
// INSEE API
using MySirene;
using MySirene.INSEE;
namespace AureaDemoPlugIn
{
public class SirenePlugIn : PlugInBase
{
/// <summary>
/// Constructor
/// </summary>
public SirenePlugIn()
{
}
/// <summary>
/// Initialize the PlugIn
/// </summary>
/// <param name="settingsNavigator"></param>
protected override void Init(XPathNavigator settingsNavigator)
{
var events = Services.Get<IEventHub>();
events.StartObserving<UpdateEventArgs>("/InfoAreas/FI/PreUpdate", OnCompanyChange);
}
/// <summary>
/// Dispose & Unregister services
/// </summary>
/// <param name="isDisposing"></param>
protected override void Dispose(bool isDisposing)
{
var events = Services.Get<IEventHub>();
events.StopObserving<UpdateEventArgs>("/InfoAreas/FI/PostUpdate", OnCompanyChange);
}
public static void OnCompanyChange(object sender, UpdateEventArgs args)
{
const int FI_NANE = 2;
const int FI_SYNONYM = 3;
const int FI_PHONE = 15;
const int FI_SIRET = 61;
LogFacility f = new LogFacility("AureaDemoPlugIn");
Log.Current.Debug(f, $"A company was changed. It's uid is {args.BusinessObject.Uid}.");
// SIRET change
if (args.BusinessObject.FieldIds.Contains(FI_SIRET))
{
Sirene sirene = new Sirene("****", "****");
//Siret siret = await sirene.GetSiret(numeroSiret); <== marche pas !
Task<Siret> tSiret = sirene.GetSiret(numeroSiret);
tSiret.Wait(); // <= reste bloqué ici (à priori)
Siret siret = tSiret.Result;
args.BusinessObject.Set(FI_NANE, siret.etablissement.uniteLegale.denominationUniteLegale);
}
}
}
} |
Si je mets le Siret siret = await sirene.GetSiret(numeroSiret); avec un async en dans le event handler OnCompanyChange j'ai une erreur qui me dit qu'on peut pas faire de l'async en ASP.NET à moins de mettre Async="true" dans la déclaration de la page ASPX.
Sauf que j'ai pas la main sur l'ASPX, et je ne maîtrise pas les effets de bord potentiels.
En revanche, le code ci-dessus, qui correspond à ma tentative de contournement, reste bloqué, je pense sur le tSiret.Wait();
Comment m'en sortir ?
Toutes les librairies REST/JSON on leurs méthodes synchrones deprecated, je suis donc obligé d'utiliser les méthodes async... Ou alors utiliser de vieilles versions pleines de trous de sécurité... :(