2015-01-28 12 views
5

Eh bitirir, sorunum çağıran istenen veri eklemek gelmez Azure Depolama Tablo üzerinde table.ExecuteAsync (...) bekliyor, ama hiç sona ermediği olmasıdır (TableResult döndürmez). InsertOrUpdate ve Update işlemleriyle aynı durum. Aynı sayıda farklı özelliklere sahip farklı tablolar da denedim - aynı problem.Azure Depolama Tablolar: table.ExecuteAsync (InsertOperation) çalıştırır bekliyor, ama asla

table.Execute (...) numaralı telefonu aradığımda her şey her tür işlem için iyi çalışır.

Dış çağrı (o zaman uyumsuz eylem MVC denetleyicisi yerleştirilir):

List<Task<ServiceResult<Boolean?>>> addPostTasks = new List<Task<Common.ServiceResult<bool?>>>();    
foreach (var userStream in userStreams) 
{ 
    Task<ServiceResult<Boolean?>> addPostTask = postsStorageSvc.AddImagePost(...); 
    postsAddImagePostTasks.Add(addPostTask); 
} 
Task.WaitAll(addPostTasks.ToArray()); 

Yöntem seslendi:

public async Task<ServiceResult<Boolean?>> AddImagePost(...) 
{ 
ServiceResult<Boolean?> result = new ServiceResult<bool?>(null); 
try 
{ 
    PostTableEntity newPost = new PostTableEntity(streamId.ToString(), Guid.NewGuid().ToString(), creatorId, date, htmlText);    
    TableOperation insertOperation = TableOperation.Insert(newPost); 
    //Following line never ends! 
    TableResult tableResult = await this._storageTableBootstrapper.Table.ExecuteAsync(insertOperation);     
    //Following line works perfect - but is not ASYNC 
    TableResult tableResult = this._storageTableBootstrapper.Table.Execute(insertOperation); 
} 
catch (Exception ex) 
{ 
    result.Result = false; 
    result.Errors.Add("AzurePostsStorageService Unexpected error: " + ex.Message); 
} 
return result; 
} 
+0

Bu yöntem nasıl aranıyor? –

+0

Ne demek istiyorsun? Bu kod bloğu async yönteminde, benim soruları çevreleyen çizgileri göstermek için güncelliyorum. –

+0

Yöntem imzasını ve nasıl adlandırdığınızı gösterin. Belki de 'Task.Result' veya 'Task.Wait' kullanarak engelliyor musunuz? –

cevap

9

:

Task.WaitAll(addPostTasks.ToArray()); 

Kişisel zaman uyumsuz yöntem geri kendisini sıralamakta çalışır

fazla ayrıntı için bu makaleye bakın Eğer Task.WaitAll kullanarak bir engelleyici çağrısı başlatılan çünkü takılıp ASP.NET senkronizasyon bağlam.

Bunun yerine, tüm yol desen zaman uyumsuz takip edip bu konuda Task.WhenAll ve await kullanmanız gerekir:

Stephan Cleary @NedStoyanov eklendi onun blog post (bu ayrıntılandırır.Beynin
await Task.WhenAll(addPostTasks.ToArray); 

):

bir diğer önemli nokta

: bir ASP.NET isteği bağlam değil (UI bağlamdır gibi) belirli iplik bağlı, ama Sadece bir seferde bir parçacığı izin vermez. Bu ilginç yön, resmi olarak belgesinin AFAIK olduğu yerde değil, SynchronizationContext hakkındaki MSDN makalemde numaralı makalede belirtilmiştir.

+2

ASP içeriği hakkında iyi bilgi, iyi bilmek. –

4

Bu kadar basit olarak - İşte

kod bu

Task.WaitAll(addPostTasks.ToArray()); 
: bu hat neden deadlock klasik 10

değiştirmeyi bağlantılar: Temel olarak Task.WaitAll blok isteği iplik

await Task.WhenAll(addPostTasks.ToArray()); 

ve await table.ExecuteAsync(...) tarafından başlatılan Tasks devamına çalıştırmak için mümkün değildir. Başka bir alternatif SynchronizatonContext geçiş yapılmasını önlemek için iç görevlere ConfigureAwait(false) kullanmaktır. Orijinal SynchronizationContext geçmek için gerekmez zaman

await table.ExecuteAsync(...).ConfigureAwait(false); 

Sen ConfigureAwait(false) kullanabilirsiniz. Senin durumunda ben sunucuda olduğu gibi tüm BEKLİYOR ile yapabilirsiniz inanıyoruz ve await sonra kod parçacığı havuzu üzerinde yürütür olmadığını fark olmamalıdır. Sorun burada msdn.microsoft.com/enus/magazine/jj991977.aspx

+0

Cevabınız, yukarıdaki ile aynı anlama gelir, ancak siz ilk Yuval Itzchakov'un daha fazla bilgi sağladığını gördünüz. –

+0

Evet, cevabı iyiydi. Ben de bir şey öğrendim. –

+0

Tamam, böylece durumu daha iyi anlamak ve anlamak. ** ".ConfigureAwait (false)" işlevini, yürütme yığınının en üstünde bulunan tüm async işlemlerimizde ** kullanmanızı öneririz (table.ExecuteAsync (...) veya kendi async işlemlerimiz/yöntemlerimiz gibi)? –

İlgili konular