Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие потоков при асинхронном исполнении, проблема с правами потоков 
V
    Опции темы
redrover
Дата 10.12.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 6.3.2009
Где: Тульская область

Репутация: нет
Всего: 1



Поставлена задача - получить результаты вычисления дополнительного потока, сгенерированного в результате асинхронного вызова сервиса в WPF приложении.
Вот как выглядит реализация асинхронного вызова:
Код

           Service prefect = new Service();
            //------------
            ClassicDelegate delegat = new ClassicDelegate(prefect.MonteCarloExp);
            AsyncCallback cb = new AsyncCallback(CallBackMethod);
            delegat.BeginInvoke(Bx, By, Cx, Cy, Ex, Ey, 1000, cb, delegat);

И далее, код обработчика callback.
Код

        private void CallBackMethod(IAsyncResult ar)
        {
            ClassicDelegate delegat = (ClassicDelegate)ar.AsyncState;
            t = delegat.EndInvoke(ar);
            textBox1.Text = Convert.ToString(t[0]);


Помогите разобраться с 
Цитата

"Необработанное исключение типа "System.InvalidOperationException" произошло в WindowsBase.dll

Дополнительные сведения: Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."


Заранее большое спасибо. 
PM MAIL   Вверх
jonie
Дата 10.12.2010, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 2
Всего: 118



Цитата

            textBox1.Text = Convert.ToString(t[0]);
вот на это наверно ругается, не так ли?
Это потому что callback вызывается в другом потоке, нежели поток, создавший textBox1 (UI поток, STA апартаменты).
вам надо сделать маршалинг, путем использования примерно такого кода:
Код

void finder_FileFound(object sender, FileFoundEventArgs e)
{
    if (listBoxFiles.Dispatcher.Thread == Thread.CurrentThread)
    {
        listBoxFiles.Items.Add(e.File);
    }
    else
    {
        listBoxFiles.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
            new EventHandler<FileFoundEventArgs>(finder_FileFound), sender, new object[] { e } );
    }
}



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
redrover
Дата 11.12.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 6.3.2009
Где: Тульская область

Репутация: нет
Всего: 1



Спасибо еще раз, разобрался.   smile 
PM MAIL   Вверх
WolfTheGrey
Дата 13.12.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: 2
Всего: 2



юзай InotifyPropertyChanged. Где через делегат указываешь контролу о поступлении свежих данных.
Dispatcher-ом - ты насильно застовляешь схавать контрол данные, но Dispatcher зависит от потока. и при частом зад******нии отказывается  работать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0401 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.