2015-02-17 5 views
0

При использовании Glimpse ADO ExecuteReaderAsync() не возвращает никакого ответа навсегда:Glimpse АДО "ExecuteReaderAsync()" не отвечает

var factory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient"); 
var conn = factory.CreateConnection(); 
conn.ConnectionString = "YourConnectionString"; 
conn.Open(); 

var cmd = conn.CreateCommand(); 
cmd.CommandText = "Select 1";     // Correct SQL is not required. If use SQL "Foo" brings same result. 

var result = cmd.ExecuteReaderAsync().Result; // NG. Responce did not return forever. 
// var result = cmd.ExecuteReader();   // OK. Responce is return soon. 

Я использую GlimpseAdo, поэтому factory.CreateConnection() создает экземпляр GlimpseDbConnection. Затем я выполняю SQL async через GlimpseDbCommand и ожидаю результат запроса async.

Но cmd.ExecuteReaderAsync().Result не ответил навсегда.
Подождите 10 минут, но не произойдет тайм-аут. Я приостановил отладку VisualStudio, отладочная инструкция находится на var result = cmd.ExecuteReaderAsync().Result;.

Я думаю ... это проблемы, вызванные асинксом.
Знаете ли вы, почему и где ответ ушел?

Спасибо за помощь!

Использована

.Net Framework 4.5.2
Glimpse.Core 1.8.6
Glimpse ADO 1.7.3
SQL Server 2008 R2

ответ

3

Эта:

var result = cmd.ExecuteReaderAsync().Result; 

Вызывает ваш код тупик. Я предполагаю, что вы запускаете приложение, которое проходит вокруг контекста синхронизации (UI, ASP.NET, Universal App или такого). Вот почему вы shouldn't block on async code

Чтобы обойти эту проблему, вы должны сделать ваш метод async Task и использовать await вместо .Result:

var result = await cmd.ExecuteReaderAsync(); 

Вы также можете увидеть Trying to call Async method synchronously. It waits on Task.Result forever и deadlock even after using ConfigureAwait(false) in Asp.Net flow для более.

+1

Спасибо за ответ! Я неправильно понял асинхронную обработку. – t2k

+0

@ t2k Ты не первый :) –

Смежные вопросы