[SL] Одна переменная для нескольких обработчиков

 
0
 
.NET
ava
ababab | 21.05.2012, 12:08
Могут ли возникнуть ошибки одновременного доступа к объекту в следующем коде?
Код выполняется в Silverlight.

Есть некий сервис, запрашивающий данные:

public static class DataService{
public static void GetSomeData(long id, Action<SomeData> callback){
var client = new WebClient();
client.DownloadStringAsync(uri);
client.DownloadStringCompleted+=(s,ea)=>{
if (ea.error != null)
callback(ea.Result)
else
MessageBox.show(ea.error);
}
}
}

И есть код:

pulbic void Test(){
var asyncCounter = 0;
foreach (var id in idList){
asyncCounter++;
DataService.GetSomeData(id, data=>{
asyncCounter--;
if (asyncCounter == 0){
DoSmthElse(...);
}
});
}
}

Здесь происходит несколько одновременных запросов, по завершении которых происходит вызов DoSmthElse();
Достигается это за счет использования переменной asyncCounter.

Могут ли быть проблемы при использовании этой одной переменной в обработчиках разных запросов в Silverlight?
Comments (2)
ava
erm0l0v | 22.05.2012, 07:35 #
По моему все обработчики событий в вашем примере должны вызываться в одном потоке, по этому никаких проблем быть не должно. Единственное вы должны понимать что не факт что все обработчики событий будут вызываться в том порядке в котором вы вызываете GetSomeData. Но как я понял для вашего кода это не критично...
ava
ababab | 22.05.2012, 13:32 #
Цитата (erm0l0v @ 22.5.2012, 07:35)
По моему все обработчики событий в вашем примере должны вызываться в одном потоке, по этому никаких проблем быть не должно.

Да, поскольку все обработчики запросов WebClient в Silverlight выполняются в UI-потоке.
Цитата (http://msdn.microsoft.com/en-us/library/cc197953(v=vs.95).aspx)
The WebClient callback, which is raised when the HTTP response is returned, is invoked on the User Interface (UI) thread, and can be used to update the properties of UI elements.

Цитата (erm0l0v @ 22.5.2012, 07:35)
Единственное вы должны понимать что не факт что все обработчики событий будут вызываться в том порядке в котором вы вызываете GetSomeData. Но как я понял для вашего кода это не критично...

Верно, не критично. Код делает несколько запросов параллельно и обработчики возвращаются в случайном порядке.

Тонкость в том, что все это будет работать только в условиях, подобных Silverlight.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  erm0l0v   ababab
advanced
Submit