воскресенье, 7 февраля 2016 г.

Корректное получение элементов списка в Task.Run


Итак, нам надо осуществить загрузку элементов списка в другой нити, для чего можно воспользоваться методом Task.Run. Однако, "в лоб" воспользоваться этим методом не удастся, так как потокобезовасность экземпляров SPWeb, как и многих других объектов не гарантируется.

Thread safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Поэтому следующий код приведет к исключению SPException с внутренним кодом 0x80010102 - ошибка потоков.
private SPWeb _web;

..............................

SPListItemCollection items;

var task1 = Task.Run(() =>
  {
    items = web.GetList(@"Lists\List1").GetItems.OfType();
  })

Решением будет являться создание нового экземпляра SPWeb внутри потока:

private SPWeb _web;

...........................

SPListItemCollection items;

var task1 = Task.Run(() =>
  {
    using (var web = _web.Site.OpenWeb())
    {
       items = web.GetList(@"Lists\List1").GetItems.OfType();
    }
  });

0 коммент.:

Отправить комментарий