Блокировка OData DataServiceContext при вызове из нескольких BackgroundWorkers - PullRequest
1 голос
/ 10 сентября 2010

У меня есть приложение Silverlight 4, которое подключается к службе OData.Моя модель отправляет несколько запросов в службу параллельно, и в обратном вызове я обрабатываю результаты, используя фонового работника.

Это прекрасно работает, если я делаю один вызов, но как только я делаю более одногоВызов параллельно - иногда это работает - но большую часть времени я получаю исключение в контексте dataservice, когда я вызываю EndExecute (это происходит, когда он добавляет сущности в свой внутренний механизм отслеживания изменений).

ТакЯ решил заблокировать службу данных в точке, которую я называю EndExecute

lock (dataService)
{
    results = query.EndExecute(queryCallback).ToList<Video>(); 
}

, которая устранила проблему, и теперь она надежно обрабатывает запросы данных.

Мой вопрос в два раза - это рекомендуемая практика?Контекст OData не является потокобезопасным?

1 Ответ

2 голосов
/ 11 сентября 2010

DataServiceContext не является потокобезопасным. У него нет привязки к потоку, но он не поддерживает одновременный вызов нескольких потоков.

Так что да, вы должны убедиться, что только один поток входит в контекст и связанные объекты (например, объекты запроса) одновременно, используя блокировку или другие средства.

...