Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > [SL] Одна переменная для нескольких обработчиков


Автор: ababab 21.5.2012, 11: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?

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

Автор: ababab 22.5.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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)