Перейти к публикации
  • Сейчас на странице   Всего пользователей: 3   (0 пользователей, 3 гостя)

Rooster

Программирование, т. 8

  

315 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

всех :О

сколько вас, человек 30?


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

у нас компании 10 лет

 

у нас еще не выработаны методологии и не всегда используются best practics

 

monkas

Поделиться сообщением


Ссылка на сообщение

тут специалисты по WCF есть?


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

ты бы ещё специалистов по MFC в этом топане спросил

Поделиться сообщением


Ссылка на сообщение

тут специалисты по WCF есть?

шо надо

Поделиться сообщением


Ссылка на сообщение

я только по KFC специалист

Amatus понравилось это

Поделиться сообщением


Ссылка на сообщение

 

у нас компании 10 лет

 

у нас еще не выработаны методологии и не всегда используются best practics

 

monkas

 

угу. они лет 7 сидели в 6 чел и называли это компанией)

 

а так у нас штат сейчас около ~60 чел

мы маленькая но перспективния компания!!11

Поделиться сообщением


Ссылка на сообщение

 

что такое генерал митинг?

у нас для повышения есть performance review раз в полгода

у нас компании 10 лет

но расширятся она начала 2 года назад

 

у нас еще не выработаны методологии и не всегда используются best practics

 

General Meeting - собрали всех в главной переговорной, рассказали о структурных изменениях внутри компании, о систематизации этих perfomance review (они были рандомные и хаотичные) и т.д.

 

Кто лучший практик - плюс в чат!

Поделиться сообщением


Ссылка на сообщение

сук ашыпку заметил((99

Поделиться сообщением


Ссылка на сообщение

 

тут специалисты по WCF есть?

шо надо
збс, доеду домой напишу вопрос

Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

@@RRREEE

 

Приложение сервер - хостит WCF

Приложение клиент - гуи винформс, подключается к серверу

 

Табличка для поиска клиентов, юзер вводит нужные фильтры и жмет ОК

DevExpress'овский GridControl забинжен на LinqServerModeSource, который условно внутри делает пагинацию скрытую с кэшем,

то есть сначала ищет количество строк по фильтру, потом тащит топ 50 и дальше недостающие строки при прокрутке.

В общем-то не принципиально, главное что это гуй.

 

 

Стектрейс происходящего в прямом порядке

 

 

......

System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick(System.EventArgs e)

наш обработчик кнопки

устанавливаем датасорс в GridControl

DevExpress.Data.v16.2.dll!DevExpress.Data.Linq.Helpers.LinqServerModeFrontEnd.CatchUp()

DevExpress.Data.v16.2.dll!DevExpress.Data.Linq.Helpers.LinqServerModeFrontEnd.OnListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataControllerBase.OnBindingListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ListDataControllerHelper.OnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataControllerBase.RaiseOnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.OnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.VisibleListSourceRowCount.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.BaseDataControllerHelper.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCore.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.CreateTopGroupInfo()

!!!!!DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.WithReentryProtection(System.Func action)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.PrepareTopGroupInfoWithTrick(DevExpress.Data.ServerModeSummaryDescriptor summaries)

дальше непосредственно код который готовит запрос на сервер для получения количества

......

и теперь наконец наш метод, который дергает контракт WCF, дальше всё внутренности .нета

mscorlib.dll!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref System.Runtime.Remoting.Proxies.MessageData msgData, int type)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage message)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage methodCall, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.Call(string action, bool oneway, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation, object ins, object outs, System.TimeSpan timeout)

System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(System.ServiceModel.Channels.Message message, System.TimeSpan timeout)

System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.SyncDuplexRequest.WaitForReply(System.TimeSpan timeout)

System.ServiceModel.Internals.dll!System.Runtime.TimeoutHelper.WaitOne(System.Threading.WaitHandle waitHandle, System.TimeSpan timeout)

mscorlib.dll!System.Threading.WaitHandle.WaitOne(System.TimeSpan timeout, bool exitContext)

mscorlib.dll!System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle waitableSafeHandle, long millisecondsTimeout, bool hasThreadAffinity, bool exitContext)

Managed to Native Transition

 

 

 

 

Восклицательными знаками обозначен конкретно тот пидор, который в итоге упадет. В дэвэкспрессе на всякий случай поставили какой-то чекер чтобы нельзя было 2 запроса параллельно делать.

На вид всё збс, запрос ушел на сервер, вызвался WaitOne, гуи должен ждать.

А ВОТ ХУЙ ВАМ

 

сразу же после этого имеем вот что (то есть продолжение стектрейса, мы не выходили из метода, который запрашивал количество, а каким-то хуем продолжаем блять дальше

 

 

 

Native to Managed Transition

System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DebuggableCallback(System.IntPtr hWnd, int msg, System.IntPtr wparam, System.IntPtr lparam)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.WndProc(ref System.Windows.Forms.Message m)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.CheckProcessMsg(ref System.Windows.Forms.Message m)

DevExpress.Utils.v16.2.dll!DevExpress.Utils.Drawing.ControlPaintHelper.ProcessWMPaint(ref System.Windows.Forms.Message m)

DevExpress.Utils.v16.2.dll!DevExpress.Utils.Drawing.ControlPaintHelper.PaintWithErrorHandling(System.Windows.Forms.PaintEventArgs paintEventArgs, int layer)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.OnPaint(System.Windows.Forms.PaintEventArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.GridView.Draw(DevExpress.Utils.Drawing.GraphicsCache e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Base.BaseView.Draw(DevExpress.Utils.Drawing.GraphicsCache e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.Draw(DevExpress.XtraGrid.Views.Base.ViewDrawArgs ee)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawCore(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawContentsCore(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawRows(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawEmptyArea(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.VisibleListSourceRowCount.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.BaseDataControllerHelper.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCore.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.CreateTopGroupInfo()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.WithReentryProtection(System.Func action)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.ReentrancyAndThreadsWatch.Throw()

 

 

 

 

Еще при присваивании датасорса изначальном, в очередь сообщений винды кладется похоже сразу два сообщения, то что непосредственно будет доставать данные, и вызов перерисовки после этого.

При этом как любое гуи оно предполагает, что оно всё однопоточное и будет выполняться в той же последовательности, как положили.

Но какого-то, извините, блять хуя, вызов WaitOne вместо того, чтобы залочить нахуй всё до получения ответа от сервера, РАЗБЛОКИРУЕТ БЛЯТЬ ПОТОК СООБЩЕНИЙ ВИНДЫ и оно честно идет дальше рисовать окошко.

А чтобы нарисовать оно снова проверяет, а сколько же мы строк в таблице имеем, идет внутрь, видит, что нихуя еще не получалось от сервера, начинает делать запрос заново, падает на ReentryLock и шлет нахуй.

При этом пидоры на девэкспрессе вместо того чтобы честно выкинуть исключение глушат нахуй всё и таблица просто притворяется в итоге, как будто она не смогла получить количество,

хотя потом через пару миллисекунд приходит ответ от сервера, пытается выйти из захваченного им ReentryLock и получает на выходе что ты братюня опоздал, контролу уже пизда.

 

 

ЧТО БЛЯТЬ ПРОИСХОДИТ НАХУЙ

это не OneWay канал с коллбеками, это обычный TwoWay, который должен быть синхронным по всем описаниям и лочить гуи поток, как и надо.

Коннект к серверу открывается в гуи потоке, так что SynchronizationContext должен быть правильный гуишный, хотя он тут вообще не должен учавствовать никак.

 

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

Даже на моем компе, где всё соседние процессы, в том числе и база, оно так делает каждый 2-3 раз. На продакшене где всё в ебенях оно будет тупо постоянно.

 

Как заставить это уебище действительно синхронно выполнять запрос


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

куда все эксперты топана с 10к баксов в месяц и 3 сиропами съебались, пиздос


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

они все фронтендом занимаются


65881.png

Поделиться сообщением


Ссылка на сообщение

@@RRREEE

 

Приложение сервер - хостит WCF

Приложение клиент - гуи винформс, подключается к серверу

 

Табличка для поиска клиентов, юзер вводит нужные фильтры и жмет ОК

DevExpress'овский GridControl забинжен на LinqServerModeSource, который условно внутри делает пагинацию скрытую с кэшем,

то есть сначала ищет количество строк по фильтру, потом тащит топ 50 и дальше недостающие строки при прокрутке.

В общем-то не принципиально, главное что это гуй.

 

 

Стектрейс происходящего в прямом порядке

 

 

......

System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick(System.EventArgs e)

наш обработчик кнопки

устанавливаем датасорс в GridControl

DevExpress.Data.v16.2.dll!DevExpress.Data.Linq.Helpers.LinqServerModeFrontEnd.CatchUp()

DevExpress.Data.v16.2.dll!DevExpress.Data.Linq.Helpers.LinqServerModeFrontEnd.OnListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataControllerBase.OnBindingListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ListDataControllerHelper.OnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataControllerBase.RaiseOnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.OnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.VisibleListSourceRowCount.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.BaseDataControllerHelper.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCore.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.CreateTopGroupInfo()

!!!!!DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.WithReentryProtection<System.__Canon>(System.Func<System.__Canon> action)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.PrepareTopGroupInfoWithTrick(DevExpress.Data.ServerModeSummaryDescriptor summaries)

дальше непосредственно код который готовит запрос на сервер для получения количества

......

и теперь наконец наш метод, который дергает контракт WCF, дальше всё внутренности .нета

mscorlib.dll!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref System.Runtime.Remoting.Proxies.MessageData msgData, int type)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage message)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage methodCall, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.Call(string action, bool oneway, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation, object ins, object outs, System.TimeSpan timeout)

System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(System.ServiceModel.Channels.Message message, System.TimeSpan timeout)

System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.SyncDuplexRequest.WaitForReply(System.TimeSpan timeout)

System.ServiceModel.Internals.dll!System.Runtime.TimeoutHelper.WaitOne(System.Threading.WaitHandle waitHandle, System.TimeSpan timeout)

mscorlib.dll!System.Threading.WaitHandle.WaitOne(System.TimeSpan timeout, bool exitContext)

mscorlib.dll!System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle waitableSafeHandle, long millisecondsTimeout, bool hasThreadAffinity, bool exitContext)

Managed to Native Transition

 

 

 

 

Восклицательными знаками обозначен конкретно тот пидор, который в итоге упадет. В дэвэкспрессе на всякий случай поставили какой-то чекер чтобы нельзя было 2 запроса параллельно делать.

На вид всё збс, запрос ушел на сервер, вызвался WaitOne, гуи должен ждать.

А ВОТ ХУЙ ВАМ

 

сразу же после этого имеем вот что (то есть продолжение стектрейса, мы не выходили из метода, который запрашивал количество, а каким-то хуем продолжаем блять дальше

 

 

 

Native to Managed Transition

System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DebuggableCallback(System.IntPtr hWnd, int msg, System.IntPtr wparam, System.IntPtr lparam)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.WndProc(ref System.Windows.Forms.Message m)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.CheckProcessMsg(ref System.Windows.Forms.Message m)

DevExpress.Utils.v16.2.dll!DevExpress.Utils.Drawing.ControlPaintHelper.ProcessWMPaint(ref System.Windows.Forms.Message m)

DevExpress.Utils.v16.2.dll!DevExpress.Utils.Drawing.ControlPaintHelper.PaintWithErrorHandling(System.Windows.Forms.PaintEventArgs paintEventArgs, int layer)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.OnPaint(System.Windows.Forms.PaintEventArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.GridView.Draw(DevExpress.Utils.Drawing.GraphicsCache e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Base.BaseView.Draw(DevExpress.Utils.Drawing.GraphicsCache e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.Draw(DevExpress.XtraGrid.Views.Base.ViewDrawArgs ee)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawCore(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawContentsCore(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawRows(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawEmptyArea(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.VisibleListSourceRowCount.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.BaseDataControllerHelper.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCore.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.CreateTopGroupInfo()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.WithReentryProtection<System.__Canon>(System.Func<System.__Canon> action)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.ReentrancyAndThreadsWatch.Throw()

 

 

 

 

Еще при присваивании датасорса изначальном, в очередь сообщений винды кладется похоже сразу два сообщения, то что непосредственно будет доставать данные, и вызов перерисовки после этого.

При этом как любое гуи оно предполагает, что оно всё однопоточное и будет выполняться в той же последовательности, как положили.

Но какого-то, извините, блять хуя, вызов WaitOne вместо того, чтобы залочить нахуй всё до получения ответа от сервера, РАЗБЛОКИРУЕТ БЛЯТЬ ПОТОК СООБЩЕНИЙ ВИНДЫ и оно честно идет дальше рисовать окошко.

А чтобы нарисовать оно снова проверяет, а сколько же мы строк в таблице имеем, идет внутрь, видит, что нихуя еще не получалось от сервера, начинает делать запрос заново, падает на ReentryLock и шлет нахуй.

При этом пидоры на девэкспрессе вместо того чтобы честно выкинуть исключение глушат нахуй всё и таблица просто притворяется в итоге, как будто она не смогла получить количество,

хотя потом через пару миллисекунд приходит ответ от сервера, пытается выйти из захваченного им ReentryLock и получает на выходе что ты братюня опоздал, контролу уже пизда.

 

 

ЧТО БЛЯТЬ ПРОИСХОДИТ НАХУЙ

это не OneWay канал с коллбеками, это обычный TwoWay, который должен быть синхронным по всем описаниям и лочить гуи поток, как и надо.

Коннект к серверу открывается в гуи потоке, так что SynchronizationContext должен быть правильный гуишный, хотя он тут вообще не должен учавствовать никак.

 

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

Даже на моем компе, где всё соседние процессы, в том числе и база, оно так делает каждый 2-3 раз. На продакшене где всё в ебенях оно будет тупо постоянно.

 

Как заставить это уебище действительно синхронно выполнять запрос

Впадлу читать


 

Жиза для любопытных

Чекнул = пидор

 

Поделиться сообщением


Ссылка на сообщение

Отладка по фотографии. :feelsgoodman:


 

DB

59221730.png


Я - гений, ёпта

bfe7003be27e8e81ce6a7d2d8192e9ae.jpg


22


msg-93176-0-72842500-1438846470_thumb.jpg

Поделиться сообщением


Ссылка на сообщение

@@RRREEE

 

Приложение сервер - хостит WCF

Приложение клиент - гуи винформс, подключается к серверу

 

Табличка для поиска клиентов, юзер вводит нужные фильтры и жмет ОК

DevExpress'овский GridControl забинжен на LinqServerModeSource, который условно внутри делает пагинацию скрытую с кэшем,

то есть сначала ищет количество строк по фильтру, потом тащит топ 50 и дальше недостающие строки при прокрутке.

В общем-то не принципиально, главное что это гуй.

 

 

Стектрейс происходящего в прямом порядке

 

 

......

System.Windows.Forms.dll!System.Windows.Forms.Control.OnClick(System.EventArgs e)

наш обработчик кнопки

устанавливаем датасорс в GridControl

DevExpress.Data.v16.2.dll!DevExpress.Data.Linq.Helpers.LinqServerModeFrontEnd.CatchUp()

DevExpress.Data.v16.2.dll!DevExpress.Data.Linq.Helpers.LinqServerModeFrontEnd.OnListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataControllerBase.OnBindingListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ListDataControllerHelper.OnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataControllerBase.RaiseOnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.OnBindingListChanged(System.ComponentModel.ListChangedEventArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.VisibleListSourceRowCount.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.BaseDataControllerHelper.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCore.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.CreateTopGroupInfo()

!!!!!DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.WithReentryProtection<System.__Canon>(System.Func<System.__Canon> action)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.PrepareTopGroupInfoWithTrick(DevExpress.Data.ServerModeSummaryDescriptor summaries)

дальше непосредственно код который готовит запрос на сервер для получения количества

......

и теперь наконец наш метод, который дергает контракт WCF, дальше всё внутренности .нета

mscorlib.dll!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref System.Runtime.Remoting.Proxies.MessageData msgData, int type)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage message)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage methodCall, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation)

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.Call(string action, bool oneway, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation, object ins, object outs, System.TimeSpan timeout)

System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(System.ServiceModel.Channels.Message message, System.TimeSpan timeout)

System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.SyncDuplexRequest.WaitForReply(System.TimeSpan timeout)

System.ServiceModel.Internals.dll!System.Runtime.TimeoutHelper.WaitOne(System.Threading.WaitHandle waitHandle, System.TimeSpan timeout)

mscorlib.dll!System.Threading.WaitHandle.WaitOne(System.TimeSpan timeout, bool exitContext)

mscorlib.dll!System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle waitableSafeHandle, long millisecondsTimeout, bool hasThreadAffinity, bool exitContext)

Managed to Native Transition

 

 

 

 

Восклицательными знаками обозначен конкретно тот пидор, который в итоге упадет. В дэвэкспрессе на всякий случай поставили какой-то чекер чтобы нельзя было 2 запроса параллельно делать.

На вид всё збс, запрос ушел на сервер, вызвался WaitOne, гуи должен ждать.

А ВОТ ХУЙ ВАМ

 

сразу же после этого имеем вот что (то есть продолжение стектрейса, мы не выходили из метода, который запрашивал количество, а каким-то хуем продолжаем блять дальше

 

 

 

Native to Managed Transition

System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.DebuggableCallback(System.IntPtr hWnd, int msg, System.IntPtr wparam, System.IntPtr lparam)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.WndProc(ref System.Windows.Forms.Message m)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.CheckProcessMsg(ref System.Windows.Forms.Message m)

DevExpress.Utils.v16.2.dll!DevExpress.Utils.Drawing.ControlPaintHelper.ProcessWMPaint(ref System.Windows.Forms.Message m)

DevExpress.Utils.v16.2.dll!DevExpress.Utils.Drawing.ControlPaintHelper.PaintWithErrorHandling(System.Windows.Forms.PaintEventArgs paintEventArgs, int layer)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.GridControl.OnPaint(System.Windows.Forms.PaintEventArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.GridView.Draw(DevExpress.Utils.Drawing.GraphicsCache e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Base.BaseView.Draw(DevExpress.Utils.Drawing.GraphicsCache e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.Draw(DevExpress.XtraGrid.Views.Base.ViewDrawArgs ee)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawCore(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawContentsCore(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawRows(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.XtraGrid.v16.2.dll!DevExpress.XtraGrid.Views.Grid.Drawing.GridPainter.DrawEmptyArea(DevExpress.XtraGrid.Views.Grid.Drawing.GridViewDrawArgs e)

DevExpress.Data.v16.2.dll!DevExpress.Data.DataController.VisibleListSourceRowCount.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.BaseDataControllerHelper.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCore.Count.get()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.CreateTopGroupInfo()

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.WithReentryProtection<System.__Canon>(System.Func<System.__Canon> action)

DevExpress.Data.v16.2.dll!DevExpress.Data.Helpers.ServerModeCache.ReentrancyAndThreadsWatch.Throw()

 

 

 

 

Еще при присваивании датасорса изначальном, в очередь сообщений винды кладется похоже сразу два сообщения, то что непосредственно будет доставать данные, и вызов перерисовки после этого.

При этом как любое гуи оно предполагает, что оно всё однопоточное и будет выполняться в той же последовательности, как положили.

Но какого-то, извините, блять хуя, вызов WaitOne вместо того, чтобы залочить нахуй всё до получения ответа от сервера, РАЗБЛОКИРУЕТ БЛЯТЬ ПОТОК СООБЩЕНИЙ ВИНДЫ и оно честно идет дальше рисовать окошко.

А чтобы нарисовать оно снова проверяет, а сколько же мы строк в таблице имеем, идет внутрь, видит, что нихуя еще не получалось от сервера, начинает делать запрос заново, падает на ReentryLock и шлет нахуй.

При этом пидоры на девэкспрессе вместо того чтобы честно выкинуть исключение глушат нахуй всё и таблица просто притворяется в итоге, как будто она не смогла получить количество,

хотя потом через пару миллисекунд приходит ответ от сервера, пытается выйти из захваченного им ReentryLock и получает на выходе что ты братюня опоздал, контролу уже пизда.

 

 

ЧТО БЛЯТЬ ПРОИСХОДИТ НАХУЙ

это не OneWay канал с коллбеками, это обычный TwoWay, который должен быть синхронным по всем описаниям и лочить гуи поток, как и надо.

Коннект к серверу открывается в гуи потоке, так что SynchronizationContext должен быть правильный гуишный, хотя он тут вообще не должен учавствовать никак.

 

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

Даже на моем компе, где всё соседние процессы, в том числе и база, оно так делает каждый 2-3 раз. На продакшене где всё в ебенях оно будет тупо постоянно.

 

Как заставить это уебище действительно синхронно выполнять запрос

1. Без кода не разобраться.

2. Могу предположить, что вызов на WCF девекспрессом идет внутри всетаки асинхронно, кароче после вызова метода, не дожидаясь резалта от сервиса, девекспресс продолжает выполнение кода в (UI thread), и обновляет дата сорс уже внутри, после того как резалт пришел асинхронно (читай доки этой либы). 

3. WCF вообще работает?

Поделиться сообщением


Ссылка на сообщение

1. какого именно, я же не скину весь солюшен, тем более что это даже не я писал

2. нет, девэкспресс это же и есть гуи, ему нахуй не всралось делать что-то асинхронно, плюс последнее, что вызывает он, это IQueryable.Count(), а дальше уже наш код который просто в конце жахнет вызов метода контракта WCF. да и когда был .нетремотинг всё было отлично

3. Да, всё работает. Мы видим в логах, как исполняется запрос в базу, как ответ возвращается на клиента, вот только уже поздно, тк контрол уже побежал вперед и считает, что он сломан.

Ну или если база успевает отработать очень быстро, то и так всё ищет. И если нет последующих сообщений, которые решат перерисовать контрол и запросить каунт заново, тоже всё ок.

 

проблема именно в том, что ожидание какого-то хуя в реальности ничего не ждет, а работает как будто await написан

 

контракт целых 2 метода

для всего кроме авторизации используется второй


  [ServiceKnownType("GetTypes", typeof(WcfUserSessionKnownTypes))]
  [ServiceContract(SessionMode = SessionMode.Allowed)]
  public interface IWcfUserSession
  {
    [OperationContract]
    UserSessionContext Authorize(RemoteAppInfo remoteAppInfo);

    [OperationContract]
    object CallContract(RemoteAppInfo remoteAppInfo, string serviceID, string method, object request);
  }

весь наш код заканчивается на вызове CallContract, никаких асинхронностей и других потоков по пути к нему нет

коннект к wcf сервису со стороны клиента вызывается в гуи потоке, я даже специально проверял в дебаггере, я был в обработчике Form_OnShown


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

1. какого именно, я же не скину весь солюшен, тем более что это даже не я писал

2. нет, девэкспресс это же и есть гуи, ему нахуй не всралось делать что-то асинхронно, плюс последнее, что вызывает он, это IQueryable.Count(), а дальше уже наш код который просто в конце жахнет вызов метода контракта WCF. да и когда был .нетремотинг всё было отлично

3. Да, всё работает. Мы видим в логах, как исполняется запрос в базу, как ответ возвращается на клиента, вот только уже поздно, тк контрол уже побежал вперед и считает, что он сломан.

Ну или если база успевает отработать очень быстро, то и так всё ищет. И если нет последующих сообщений, которые решат перерисовать контрол и запросить каунт заново, тоже всё ок.

 

проблема именно в том, что ожидание какого-то хуя в реальности ничего не ждет, а работает как будто await написан

 

контракт целых 2 метода

для всего кроме авторизации используется второй


  [ServiceKnownType("GetTypes", typeof(WcfUserSessionKnownTypes))]
  [ServiceContract(SessionMode = SessionMode.Allowed)]
  public interface IWcfUserSession
  {
    [OperationContract]
    UserSessionContext Authorize(RemoteAppInfo remoteAppInfo);

    [OperationContract]
    object CallContract(RemoteAppInfo remoteAppInfo, string serviceID, string method, object request);
  }

весь наш код заканчивается на вызове CallContract, никаких асинхронностей и других потоков по пути к нему нет

коннект к wcf сервису со стороны клиента вызывается в гуи потоке, я даже специально проверял в дебаггере, я был в обработчике Form_OnShown

WCF - работает, следовательно проблемы с GUI контролом. Тут гугл в помощь.

Поделиться сообщением


Ссылка на сообщение

он не блокирует

вот что в нем не работает

 

две соседних версии, одна на всф, другая на ремотинге

 

в одной всё ломается, в другой всё заебись

 

ни строчки в гуи не поменялось, вообще


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение
(изменено)

он не блокирует

вот что в нем не работает

 

две соседних версии, одна на всф, другая на ремотинге

 

в одной всё ломается, в другой всё заебись

 

ни строчки в гуи не поменялось, вообще

Сравни web.config обоих сервисов на сервере. Проверь сериализаторы.

Данные в правильном формате передаются?


Изменено пользователем RRREEE

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...