2015-02-04 4 views
0

У меня есть следующий код в библиотеке Helper.dll. Эта сборка имеет встроенный XML-файл под названием Products.XML. Метод GetProducts отлично работает. Но требуется несколько секунд, чтобы ответить, потому что это синхронно. Я хочу выпустить интерфейс, когда эта операция загрузки продолжалась.Изменение синхронного вызова Async

Есть нет асинхронных вызовов не доступны для LINQ к XML операций, как XDocument.Load, так что я не могу использовать async и await здесь.

Цените любой ответ.

public static class LookupUtil 
{ 
    public static IEnumerable<XElement> GetProducts() 
    { 
     var stream = Assembly. 
      GetExecutingAssembly(). 
      GetManifestResourceStream("Helper.Products.XML"); 
     var reader = new XmlTextReader(stream); 
     var document = XDocument.Load(reader); 

     return document.Descendants("Products"); 
    } 
} 
+0

Я бы рекомендовал использовать 'Task.Run' в вызывающем коде. Не пытайтесь подделывать асинхронное поведение в коде библиотеки. –

ответ

3

Если у вас нет каких-либо асинхронных операций внутри этого метода не изменить его и держать его синхронное.

использование Task.Run при вызове его из потока пользовательского интерфейса, чтобы разгрузить эту синхронную работу в другом потоке и await возвращенного задачи:

var elements = await Task.Run(() => LookupUtil.GetProducts()); 

Что вы в основном делаете обработку блок синхронного кода асинхронно.

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