Тема: Ошибка при получение SingleNmkFromId в цикле

Добрый день!
Если max = 5, то ошибки нет. Если max = 100, то ошибка есть. Картинка во вложении.


            fTcs = new CSDN.TCS();
            app = (CSDN.Tcs_Application) fTcs.LoginCurrent();
            var i = 0;
            var max = 100;
            while (i < max)
            {
                Random rnd = new Random();
                int id = rnd.Next(100000, 200000);

                try
                {
                    var sn = app.SingleNmkFromId[id];
                    Console.WriteLine(i + " " + sn.Properties["NOTE"].AsString);
                    i++;
                }
                catch (Exception e)
                {
                }
            }
Post's attachments

err.JPG 23.2 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

Re: Ошибка при получение SingleNmkFromId в цикле

Сложно сказать что то сказать, код ведь изначально нерабочмй.
Так работает,число можно любое задать.

Sub TestRandom
 Cnt = 0
 ErrCnt = 0
 Dim Out' As ICSDNStrings
 Dim n' As ISingleNomenclature
 Set Out = theApp.CreateStrings
 On error Resume Next
 for i=1 to 1000
   Call theApp.ShowProgressMessage( "Cnt=" & i, "wait" )
   set n = theApp.SingleNmkFromId( i )
   if n is Nothing Then
     ErrCnt = ErrCnt + 1
   Else
     Cnt = Cnt + 1
     n.UserModuleName = n.UniqueUserModuleName
     theApp.DeleteModuleByUserModuleName( n.UserModuleName )
     idx = Out.Add( i & "=" &  n.Properties( "ID" ).AsInteger & "-->" & n.Properties( "NOTE" ).AsSafeString )
   End If
 next
 Call theApp.HideProgressMessage

 Idx = Out.ShowModal( "Success=" & Cnt & ",Error=" & ErrCnt, 800, 600 )

End Sub

Re: Ошибка при получение SingleNmkFromId в цикле

Олег Зырянов пишет:

код ведь изначально нерабочмй

Почему нерабочий, потому что рандомные числа берутся? Это сделано только для того, чтобы вы смогли запустить пример. На самом деле нужно пробегаться по конкретному списку из примерно 200 позиций. Ошибка при этом тоже возникает.

Вы пробовали запускать мой пример? Ошибка возникает?

И ещё вопрос: зачем делать эти две строчки?

     n.UserModuleName = n.UniqueUserModuleName
     theApp.DeleteModuleByUserModuleName( n.UserModuleName )

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

Re: Ошибка при получение SingleNmkFromId в цикле

Почему нерабочий, потому что рандомные числа берутся?

У нас в доке на сказано что будет если передать невалидный ID. Если там возникнет исключение - то может все и нормально, так как у вас дальнейший код сразу отвалится. А если там вернется null, то тогда идет дальнейшая работа с невалидным объектом. Несмертельно но и ничего хорошо.

И ещё вопрос: зачем делать эти две строчки?

Пости все объекты, создаваемые от Application у нас глобальные. Один раз создаются и живут все время.
Это позволяет проще писать скрипты. Но! Создавая кучу таких объектов в итоге вы можете получить Out of memory или Out of system resources. Поэтому если вы создаете их много - лучше их удалять.

Вы пробовали запускать мой пример? Ошибка возникает?

Не пробовал, но просто пример аналогичный написал, обработав ошибки и сразу подчистив объекты.

В Net вы не управляете временем жизни объекта, за вас это делает сборщик мусора. Возможно в этом проблема, не знаю что у вас в данном случае, подозреваю что ошибка идет на этапе уничтожения объектов.

Спасибо сказали: q41HCxSH0bAz1Reugyc01

(изменено: q41HCxSH0bAz1Reugyc0, 10 июня 2020 14:54:53)

Re: Ошибка при получение SingleNmkFromId в цикле

Добавил в конце программы:

GC.Collect();

Ошибка исчезла.