2015-09-03 6 views
1

У меня есть функция, которая заполняет поле со списком в моем приложении winform. Операция занимает несколько секунд, поэтому я хотел бы сделать ее асинхронной.Сделать Entity Framework Linq query async

Вот функция:

public static List<string> GetAllPostCodeRegions(string country) 
{ 
    using (var db = new PlaceDBContext()) 
    { 
     var regions = db.PostCodes.Where(pc => pc.Country == country).OrderBy(pc => pc.Region).Select(pc => pc.Region).Distinct().ToList(); 

     return regions; 
    } 
} 

Я попытался просто добавить в асинхронном ключевых слов, как показано ниже:

public async static Task<List<string>> GetAllPostCodeRegions(string country) 
{ 
    using (var db = new PlaceDBContext()) 
    { 
     var regions = db.PostCodes.Where(pc => pc.Country == country).OrderBy(pc => pc.Region).Select(pc => pc.Region).Distinct().ToList(); 

     return regions; 
    } 
} 

Но это ничего не ждет, и пользовательский интерфейс по-прежнему блокирует, когда я звоню:

var regions = await DataFunctions.GetAllPostCodeRegions("UK"); 

Как сделать эту операцию асинхронной и остановить блокировку пользовательского интерфейса?

+1

Вы должны вызвать ToListAsync() вместо ToList() и добавить AWAIT перед этим утверждением. Для этого требуется Entity Framework 6 или выше. –

+1

Спасибо. Мне также нужно было добавить 'using System.Data.Entity', поскольку использование ctrl + period не подсказывало это по какой-либо причине. – Guerrilla

ответ

0

вы можете попробовать .ToListAsync или:

public static Task<List<string>> GetAllPostCodeRegions(string country) 
{ 
    return Task.Run(() => 
     { 
      using (var db = new PlaceDBContext()) 
      { 
       return db.PostCodes 
         .Where(pc => pc.Country == country) 
         .OrderBy(pc => pc.Region) 
         .Select(pc => pc.Region).Distinct().ToList(); 
      } 
     });   
} 
+0

Я сказал, что оба варианта, сделайте это самим собой, это не так сложно –