|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.10.2010, 21:37 | #1 |
Пользователь
Регистрация: 10.10.2010
Сообщений: 48
|
Асинхронный вызов в C#
Здравствуйте, уважаемые кодеры!
Возникла трудная ситуация в C#, надеюсь получить от вас подсказку или совет. Задача такая: надо вызывать функцию асинхронно, делаю так, например: Код:
00:00:00.0028317 все потоки запущены 00:00:00.0030933, вход в функцию f с индексом 0 00:00:00.0085026, вход в функцию f с индексом 1 00:00:01.0079474, вход в функцию f с индексом 2 00:00:01.0667081, вход в функцию f с индексом 3 00:00:01.0695319, вход в функцию f с индексом 4 00:00:01.5062641, вход в функцию f с индексом 5 00:00:02.0060604, вход в функцию f с индексом 6 00:00:02.0089810, вход в функцию f с индексом 7 00:00:02.0675756, вход в функцию f с индексом 8 00:00:02.0708866, вход в функцию f с индексом 9 Т. е. куда-то просто выбрасывается две секунды, при том, что мне крайне важна производительность. Пробовал делать с пулом по примеру из статьи с rsdn, но результат ровно такой же, наверное что-то не учел. Подскажите пожалуйста, на что здесь обратить внимание.. |
27.10.2010, 19:28 | #3 |
Пользователь
Регистрация: 10.10.2010
Сообщений: 48
|
Статья не о чем. Один человек сказал в комментариях "Don’t use the delegate BeginInvoke method to kick off lots of small pieces of work because the code behind the method uses very slow Reflection APIs" ну так я это и так вижу, и пример привел.
Я спрашивал как можно сделать по-другому, чтобы работало хорошо. Или .net в принципе не способен на хорошую производительность? Последний раз редактировалось q_proger; 27.10.2010 в 19:31. |
30.10.2010, 18:17 | #4 |
Пользователь
Регистрация: 16.03.2010
Сообщений: 58
|
операция создания потоков крайне ресурсоемкая.. поэтому рекомендуется использовать пулы потоки которых не создаются более одного раза.. а когда поточная функция отработает они "ложатся отдыхать"
|
01.11.2010, 19:04 | #5 |
Пользователь
Регистрация: 10.10.2010
Сообщений: 48
|
elja_1989 спасибо! Я подозревал, что как-то так и стоит делать, но пока не разобрался как именно, а впрочем это уже не актуально
|
14.12.2010, 00:51 | #6 |
Пользователь
Регистрация: 10.10.2010
Сообщений: 48
|
Если кому-то будет интересна эта тема, отличной производительности в решении подобных задач можно достичь работая с методами System.Threading.Monitor.
А вот тут http://www.rsdn.ru/article/dotnet/CSThreading1.xml хорошо обо всем этом написано. |
15.12.2010, 14:49 | #7 |
Форумчанин
Регистрация: 20.04.2008
Сообщений: 139
|
с консолья не работал.но begininvoke всего лишь выполняет метод в том потоке где создан объект вызывающий этот инвок.а monitor это уже многопоточность.обычно люди выполняют вычисления в потоках,потом уже с помощью асинхронного вызова на форму выводят результат
|
16.12.2010, 23:27 | #8 |
Пользователь
Регистрация: 10.10.2010
Сообщений: 48
|
Не силен в этих тонкостях, но если бы BeginInvoke вызывал функцию "f" в том потоке, в котором был создан объект-делегат, в который она завернута, то есть в главном потоке, то никакого параллелизма бы не было, строки появлялись бы с интервалом в секунду.
То, что вы описали, верно для Код:
Код:
Код:
Последний раз редактировалось q_proger; 16.12.2010 в 23:30. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Асинхронный режим работы в WinSock | ImmortalAlexSan | Работа с сетью в Delphi | 2 | 28.04.2011 22:19 |
Странное поведение WriteFile / WriteFileEx (асинхронный I/O) | besserebrenik | Win Api | 0 | 22.02.2010 20:37 |
Асинхронный просмотр | Claster | Помощь студентам | 6 | 11.02.2010 15:38 |
Асинхронный сокет | raspberry | C/C++ Сетевое программирование | 8 | 07.07.2009 16:51 |
Асинхронный ввод/вывод | Pblog | Обсуждение статей | 0 | 27.05.2007 02:13 |