2017-07-17 1 views
0

J'écrivais une tâche planifiée pour l'actualisation du jeton d'accès à partir de tradeGecko. Voici le code pour la tâche:Appel d'une méthode asynchrone dans nopCommerce 3.9 Tâches planifiées

using Newtonsoft.Json.Linq; 
using Nop.Core; 
using Nop.Core.Domain.Orders; 
using Nop.Services.Configuration; 
using Nop.Services.Tasks; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Http; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using static Nop.Core.TradeGeckoHelperMethods; 

namespace Nop.Services.Catalog 
{ 
    public partial class TradeGeckoRefreshToken : ITask 
    { 
     private readonly IStoreContext _storeContext; 
     private readonly ISettingService _settingService; 

     public TradeGeckoRefreshToken(IStoreContext storeContext, ISettingService settingService) 
     { 
      _storeContext = storeContext; 
      _settingService = settingService; 
     } 

     public async System.Threading.Tasks.Task UpdateRefreshToken() 
     { 
      var orderSettings = _settingService.LoadSetting<OrderSettings>(); 
      Task<JObject> returnObject = TradeGeckoHelperMethods.RefreshAccessToken(orderSettings.TradeGeckoApplicationId, orderSettings.TradeGeckoSecretId, orderSettings.TradeGeckoCallBackUrl, orderSettings.TradeGeckoRefreshToken); 
      JObject refresheObject = await returnObject; 

      if (refresheObject[JsonKeys.AccessToken] != null) 
      { 
       Console.WriteLine(refresheObject[JsonKeys.AccessToken].ToString()); 
       orderSettings.TradeGeckoAccessToken = refresheObject[JsonKeys.AccessToken].ToString(); 
       orderSettings.TradeGeckoRefreshToken = refresheObject[JsonKeys.RefreshToken].ToString(); 
       _settingService.SaveSetting(orderSettings); 
       _settingService.ClearCache(); 
      } 
     } 

     public void Execute() 
     { 
      System.Threading.Tasks.Task t = UpdateRefreshToken(); 
      Thread.Sleep(2000); 
     } 
    } 
} 

Pendant l'exécution de la tâche manuellement à partir du panneau d'administration parfois produit l'erreur suivante:

message = Il existe déjà un DataReader ouverte associée à cette commande qui doit être fermé premier.

Est-ce que je le fais bien? OU il y a mieux à faire.

+0

Avez-vous vraiment un 'Thread.Sleep' là? – Fabiano

+0

oui, sans cela le '' UpdateRefreshToken'' ne sera jamais frappé. Peut-être que je fais tout faux. Je ne suis pas bon en ce qui concerne les choses asynchrones. – lukai

Répondre