2016-04-26 7 views
1

Ich habe gekämpft, um Code auf einer neuen Maschine zu arbeiten .. Ich dachte, ich hatte es endlich funktioniert, aber jetzt, wenn ich es ausführen hängt der Code an dem Punkt zu versuchen Erstelle den Tabellenspeicher (oder bekomme tatsächlich einen Verweis darauf, wie es bereits existiert) ... Ich weiß, dass ich sicherstellen muss, dass es durchgängig async ist und dieser Code funktioniert ... Ich habe mich geändert es zu versuchen und zu verbessern und bekommt es auf dieser Maschine zu arbeiten, aber etwas nicht stimmt ... Also im Konstruktor des Repo ich dies tun ....Azure Tabellenspeicher - CreateTableIfNotExists hängt - war früher

public LdsRepo() 
    { 

     if (!GetTableRef("licensedatesummary").Result) 
     { 
      throw new Exception("It broke!"); 
     } 
    } 

und meine GetTableReference-Methode (auf dem Basisklasse) ist so ...

protected async Task<bool> GetTableRef(string tableRef) 
    { 
     try 
     { 
      if (string.IsNullOrEmpty(StorageAccountName) || string.IsNullOrEmpty(AuthKey)) 
      { 
       throw new ArgumentNullException(nameof(tableRef), 
        "storageaccountname or authk are not set in the config"); 
      } 
      if (_tableClient == null) 
       _tableClient = 
        new CloudStorageAccount(new StorageCredentials(StorageAccountName, AuthKey), true) 
         .CreateCloudTableClient(); 
      if (_table == null) 
      { 
       // Create the CloudTable object that represents the referenced table. 
       _table = _tableClient.GetTableReference(tableRef); 
       var x = _table.CreateIfNotExistsAsync(); 
       return await x; 
      } 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine(ex.Message); 
      Trace.WriteLine(ex.ToString()); 
      return false; 
     } 
    } 

und wenn es hilft ... das ist meine Pakete Config ...

<packages> 
<package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net452" /> 
<package id="Microsoft.Data.Edm" version="5.7.0" targetFramework="net452" /> 
<package id="Microsoft.Data.OData" version="5.7.0" targetFramework="net452" /> 
<package id="Microsoft.Data.Services.Client" version="5.7.0" targetFramework="net452" /> 
<package id="Microsoft.Web.WebJobs.Publish" version="1.0.11" targetFramework="net452" /> 
<package id="Microsoft.WindowsAzure.ConfigurationManager" version="3.2.1" targetFramework="net452" /> 
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net452" /> 
<package id="System.Spatial" version="5.7.0" targetFramework="net452" /> 
<package id="WindowsAzure.Storage" version="7.0.0" targetFramework="net452" /> </packages> 

Und schließlich meine eigentliche WebAPI Controller ....

[EnableCors(origins: "*", headers: "*", methods: "*")] 
[RoutePrefix("api")] 
public class LinkDataController : ApiController 
{ 
    private readonly IFloatingObjectRecordRepo _repo; 
    public LinkDataController() 
    { 
     _repo = new FloatingObjectRecordRepo(); 
    } 
    [HttpGet, Route("linkdata/{id}")] 
    public async Task<IHttpActionResult> Get(string id) 
    { 
     try 
     { 
      if (string.IsNullOrEmpty(id)) 
      { 
       return BadRequest(); 
      } 
      var retStr = await _repo.SearchById(id); 
      if (retStr == "Not found") 
       return new IsoncOkResult<KeyValuePair<string, string>>(
        new KeyValuePair<string, string>(id, retStr), this); 
      var g = Guid.NewGuid(); 
      var f = await _repo.Add(new FlorData 
      { 
       CreatedBy = "Ais Integration Search", 
       Mmsi = id, 
       CreatedOn = DateTime.Now, 
       GeneratedId = g, 
       RowKey = g.ToString() 
      }); 
      retStr = f.GeneratedId.ToString(); 
      return new IsoncOkResult<KeyValuePair<string, string>>(new KeyValuePair<string, string>(id, retStr), this); 
     } 
     catch (Exception ex) 
     { 
      Trace.TraceError($"Error Searching/Creating AIS Link Data: {ex}"); 
      return BadRequest(ex.ToString()); 
     } 
    } 
    } 

ich hier gesucht ziemlich ausgiebig, aber jedes Mal, wenn jemand die asynchrone Kette nicht ganz durchgegangen ist, was ich denke, mache ich?

Antwort

2

Wenn

if (!GetTableRef("licensedatesummary").Result) 

mit Du den Punkt „Async den ganzen Weg“ fehlt, siehe This question für einen Unterschied zwischen await Aufgabe und Task.Result.

Es gibt mehrere Optionen, um dieses Problem zu lösen, hier sind nur zwei:

  1. Sie können die „GetTableRef“ ändern synchron zu sein (wenn dies die einzige Nutzung, die Sie für dieses Verfahren haben, als diese sollte eine vernünftige Option sein, da es keinen Vorteil bringt, die async-Methode nur im blockierenden Kontext zu verwenden, indem Sie die CreateIfNotExists() - Methode anstelle von CreateIfNotExistsAsync() verwenden.
  2. Siehe How to call async method in constructor, die einige Techniken für solches Szenario
+0

Dank erklärt, und ja, sie ist absolut hat bekam synchron sein, da man nichts anderes tun können, bis Sie tatsächlich einen Verweis auf, oder haben erstellt die Tabelle, daher sollte dies nicht asynch sein. – dreadeddev

Verwandte Themen