<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3498656</guid>
        <pubDate>Tue, 08 Jul 2014 09:39:49 +0000</pubDate>
        <title>Одно и то же работает в Remoting и не работает в WCF</title>
        <link>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3498656</link>
        <description><![CDATA[hd44780: Спасибо, конечно, но уже всё это увы давно неактуально. Жизнь и судьба увели меня да-алеко от C# и .NET.<br>А в виде хобби этим заниматься совершенно некогда.<br><br>PS.<br>Если честно, я даже не знаю, что такое SCRUM :yes-sad: ...]]></description>
        <author>hd44780</author>
        <category>.NET: Распределенные приложения</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3188712</guid>
        <pubDate>Tue, 14 Aug 2012 15:04:24 +0000</pubDate>
        <title>Одно и то же работает в Remoting и не работает в WCF</title>
        <link>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3188712</link>
        <description><![CDATA[maxim84_: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>while ( MainFormServer.queueToRemoting.Count == 0 );</div></div><br>
сама по-себе конструкция плохая. Будет много таких потоков, то ресурсов от процессора не останется. лучше использовать [Auto/Manual]ResetEvent.<br>
Или колбеки использовать, что лучше всего, в WCF есть такая возможность.<br>
Или уж тогда:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">while ( MainFormServer.queueToRemoting.Count == 0 )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Thread.Sleep(1);</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Но ручные слипы потоков - это очень плохо. Старайтесь избегать таких конструкций.<br>
<br>
Что касается вашего вопроса, то сложно сказать, есть предположение, что каждое обращение к переменной создавался пакет на хост ремотящего объекта MainFormServer, что выглядело примерно так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int count = MainFormServer.RequestQueueCount();</div><div class="code_line">while ( count == 0 )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; count = MainFormServer.RequestQueueCount();</div><div class="code_line">}</div></ol></div></div></div></div><br>
Поскольку RequestQueueCount вызов, то поток не жрал ресурсы, а честно выполнял инструкции и стоял на объектах синхронизации внутри ремотинга.<br>
<br>
WCF, все-же продвинутей ремотинга, нужно просто посмотреть на ту часть кода и проследить идут ли запросы на ремотящий сервис MainFormServer, для нормальной работы должен быть создан запрос на каждой итерации. Возможно, WCF как-то кеширует значения, т.е. если отправляются 100500 запросов в сек нет смысла слать их все и это значит что поток сожрет ресурсы т.к. кроме цикла он ничего не делает.<br>
<br>
Надо будет поиграться :)]]></description>
        <author>maxim84_</author>
        <category>.NET: Распределенные приложения</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3188565</guid>
        <pubDate>Tue, 14 Aug 2012 10:49:34 +0000</pubDate>
        <title>Одно и то же работает в Remoting и не работает в WCF</title>
        <link>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3188565</link>
        <description><![CDATA[hd44780: Делюсь :) .<br>
<br>
Зависон сервера и дикая загрузка проца связана были со строчкой<br>
<br>
// Ждать завершения<br>
           while ( MainFormServer.queueToRemoting.Count == 0 );<br>
<br>
Таймер формы не видит команду и ничего не делает, в выходной очереди queueToRemoting ничего не появляется, соответственно цикл висит и вешает всё. В такие циклы надо что-то типа Thread.Sleep вставлять, либо таймаут делать, либо вообще менять идеологию опроса очереди.<br>
Но это так, мелкие сопутствующие проблемы ... Хоть и неправильно было изначально так делать. Но что сделано, то сделано ....<br>
<br>
Гораздо большее западло сидело в неверной передаче данных между потоками.<br>
WCF - один поток, форма - другой поток. Как только я начал думать в этом направлении, почти сразу же всплыло решение.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// Подать команду серверу</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;/summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;param name=&quot;sCommand&quot;&#62;Сериализованый объект команды&#60;/param&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;returns&#62;Сериализованный ответ&#60;/returns&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public string SetCommand( string sCommand )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Проверка объекта команды</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( !CllCntCommand.CanDeserializeDoc ( sCommand ) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ // ошибка</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CllCntServerAnswer answ = new CllCntServerAnswer ( -1, &nbsp;&quot;ОШИБКА СЕРВЕРА: Неверная команда&quot; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;answ.text = sCommand;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return answ.SerializeStr ( );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} // if</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return (string)MainFormServer.mForm.Invoke(MainFormServer.mForm.commandDlg, sCommand);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} // SetCommand</div></ol></div></div></div></div><br>
<br>
Куски из MainFormServer:<br>
<br>
В переменных формы<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// Ссылка на форму</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;/summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public static MainFormServer mForm;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// Тип делегата</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;/summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;param name=&quot;myString&quot;&#62;Команда&#60;/param&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;returns&#62;ОТвет на команду&#60;/returns&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public delegate string DoCommandDelegate(String myString);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// Делегат для подачи команды</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;/summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public DoCommandDelegate commandDlg;</div></ol></div></div></div></div><br>
<br>
Это статическая ссылка на форму и делегат, обрабатывающий команды клиента.<br>
В событии загрузки формы инициализируем добро:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Делегат выполнения команд</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mForm = this;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;commandDlg = DoCommand;</div></ol></div></div></div></div><br>
Может можно и в конструкторе, не знаю, не проверял, в загрузке мне кажется надёжнее... Типа объект формы уже полностью инициализирован и пр.<br>
<br>
Метод обрабатывающий команды:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private string DoCommand(string sCommand)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return &quot;Ответ на команду &quot;+sCommand;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} // DoCommand</div></ol></div></div></div></div><br>
<br>
Таймер и очереди я вообще убрал. Всё равно у меня 100% синхронная отработка команд.<br>
<br>
Так делать вообще правильнее, хотя я и по сей день не понимаю - почему старый вариант с таймером и очередями как часы работал в Remoting без единого сбоя, а в WCF вообще не работает :-? .<br>
Если кто мне объяснит сей &quot;парадокс&quot;, буду благодарен.<br>
<br>
И почему в книгах про WCF даются только примитивные примеры для детского садика типа a+b/c, а действительно сложных вещей с подводными камнями (типа описанных выше) никто нигде не описывает?<br>
Нужели все думают, что 100% задач решаемы исключительно в рамках этого одного класса :wacko: примитивными методами вроде a+b/c?]]></description>
        <author>hd44780</author>
        <category>.NET: Распределенные приложения</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3188524</guid>
        <pubDate>Tue, 14 Aug 2012 09:35:02 +0000</pubDate>
        <title>Одно и то же работает в Remoting и не работает в WCF</title>
        <link>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3188524</link>
        <description><![CDATA[Mr.Delphist: Поделись?]]></description>
        <author>Mr.Delphist</author>
        <category>.NET: Распределенные приложения</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3183400</guid>
        <pubDate>Fri, 03 Aug 2012 08:52:25 +0000</pubDate>
        <title>Одно и то же работает в Remoting и не работает в WCF</title>
        <link>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3183400</link>
        <description><![CDATA[hd44780: Мда ...<br><br>Разобрался сам ... Спустя много дней :rolleyes: .]]></description>
        <author>hd44780</author>
        <category>.NET: Распределенные приложения</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3117796</guid>
        <pubDate>Fri, 13 Apr 2012 10:35:34 +0000</pubDate>
        <title>Одно и то же работает в Remoting и не работает в WCF</title>
        <link>https://forum.sources.ru/index.php?showtopic=355364&amp;view=findpost&amp;p=3117796</link>
        <description><![CDATA[hd44780: Есть класс, реализующий функционал Remoting/WCF, в нём метод:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// Подать команду серверу</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;/summary&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;param name=&quot;sCommand&quot;&#62;Сериализованый объект команды&#60;/param&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/// &#60;returns&#62;Сериализованный ответ&#60;/returns&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public string SetCommand( string sCommand )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// поместить команду в очередь ядра</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MainFormServer.queueFromRemoting.Enqueue ( sCommand );</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;File.AppendAllText(&quot;log.txt&quot;, &quot;Command: &quot; + sCommand + &quot;\n enqueueed\n&quot;,</div><div class="code_line">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Encoding.GetEncoding(1251));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Ждать завершения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while ( MainFormServer.queueToRemoting.Count == 0 );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// вернуть клиенту ответ</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return MainFormServer.queueToRemoting.Dequeue ( );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
Что делает, думаю, понятно...<br>
В форме работает таймер, который мониторит queueFromRemoting (она public static) и отрабатывает команды.<br>
<br>
Это проработало в Remoting уже лет 5, всё как часы, идеально. И не на одной машине.<br>
Когда я переключился на WCF, метод вызывается (следил по логу - закомментаренная строчка), команда вроде проходит, но в очереди ничего не появляется (делал лог в таймере, длина очереди всегда ==0).<br>
При этом сервер виснет, жрёт проц по-полной (50% 2-х голового камня) :crazy: , а клиент отваливается где-то через минуту по таймауту :wacko: .<br>
Сервер, естественно, приходится вышибать руками через диспетчер задач.<br>
<br>
Исключений нигде не вылетает.<br>
В чём м.б. причина? Или к статическому объекту нельзя из WCF обращаться?<br>
<br>
Спасибо.]]></description>
        <author>hd44780</author>
        <category>.NET: Распределенные приложения</category>
      </item>
	
      </channel>
      </rss>
	