2013-08-23 2 views
2

SQL 명령을 실행하고 DataTable을 반환하기 위해 비동기 패턴을 사용하려고합니다. 누군가이 문제를 해결하는 방법에 대해 조언을 구할 수 있습니까? 나는 당신이 당신의 호출 스택까지 더 Wait 또는 Result을 사용하는 의심ExecuteReaderAsync를 사용할 때 교착 상태가 발생합니다.

private static async Task<DataTable> ExecuteAsync(Connections connection, SqlBuilder sql) 
    { 
     using (SqlConnection conn = new SqlConnection(GetConnectstring(connection))) 
     { 
      await conn.OpenAsync(); 
      using (SqlCommand cmd = new SqlCommand(sql.Query, conn)) 
      { 
       foreach (var parameter in sql.ColumnValues.Where(d => !d.Name.StartsWith("#"))) 
       { 
        cmd.Parameters.AddWithValue(parameter.Name, parameter.Value); 
       } 

       //Why am I getting a deadlock when executing the next line? 
       using (SqlDataReader reader = await cmd.ExecuteReaderAsync()) 
       { 
        DataTable dt = new DataTable(); 
        dt.Load(reader); 
        return dt; 
       } 
      } 
     } 
    } 

안부, 토마스

+1

서버 연결 시간 초과가 아니라 교착 상태입니까? – bradgonesurfing

+0

교착 상태에 있음을 어떻게 알 수 있습니까? 잘못된 서버에 연결했거나 연결 속도가 느리거나 너무 많은 데이터를 반환했을 수 있습니다. 동기 메서드를 사용하는 경우 메서드가 작동합니까? –

+0

"교착 상태"를 특성화해야합니다. 또한 SQL Server에서 생성 할 수있는 예외이기도합니다. 나는 이것이 진짜 문제라고 생각한다. –

답변

10

:

이 내 코드입니다. 이 causes a deadlock은 UI 스레드에서 호출하면됩니다. 블로그에서 설명합니다.

+0

결과를 사용하지 않는 "100 % 확신"후에도 코드에서 숨겨진 것을 발견했습니다. 고맙습니다... – thomas