Имя: Пароль:
1C
1С v8
В C# работаю с 1С через com не могу понять как оборвать соединение...
0 fierylions
 
08.05.15
10:28
После выполнения службы windows написанной на C# в 1С остается com соединение. Как можно отсоединится от базы?

Пример:
try
            {
                Random rd = new Random();

                V82.COMConnector com1s = new V82.COMConnector();
              
                com1s.PoolCapacity = 1;

                com1s.PoolTimeout = 1;

                com1s.MaxConnections = 1;
            
                string user = "";
                string pas = "";
                string file = "ПутьКБазе";
                
                dynamic result;                

//тут выполняется определенное действие в базе 1С

                result = com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';");


                }
                                                
                rd           = null;
                MassivZadach = null;
                
                result       = null;
               com1s         = null;






Так вот обнуление и уничтожение переменных не помогает com соединение в 1С все ровно висит....

Пробывал и result.Exit() (Quit,Close,0,null) нечего не помогает.А у самого объекта com com1s пишет вообще таких методов нет...


Может у кого то есть пример ?
1 Serginio1
 
08.05.15
10:36
FinalReleaseComObject
А еще http://metanit.com/sharp/tutorial/8.1.php
http://rsdn.ru/article/dotnet/GCnet.xml

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
2 fierylions
 
08.05.15
11:05
(1) Спасибо попробую.
3 fierylions
 
08.05.15
12:01
(1) к сожалению соединение остается... единственное что изменилось если второй раз приконектится тогда исчезает старое соединение и появляется новое. А без этих строк всегда соединения добавлялись +1.

Может есть еще идеи?
4 yukon
 
08.05.15
12:09
Поробуй:

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(com1s);

повтори для всех COM-Объектов.
5 lucifer
 
08.05.15
12:22
(0)
6 Serginio1
 
08.05.15
12:22
1С может кэшировать соединения

MaxConnections (MaxConnections)
Использование:

Только чтение.
Описание:

Тип: Число.
Определяет максимальное число одновременно существующих объектов Внешнее соединение, созданных через данный менеджер COM-соединений. Число одновременно существующих соединений включает также число соединений, находящихся в пуле внешних соединений. Значением по умолчанию 0 (число одновременно существующих объектов Внешнее соединение не ограничено).
Устанавливать свойству не нулевое значение можно только в том случае, если сам объект был создан в Multithreaded Apartment (MTA), что обеспечивает реальное функционирование самого менеджера и созданных им объектов Внешнее соединение в многопотоковой (multithreaded) среде. Это условие соблюдается в частности, если COM-соединитель был создан в приложении ASP.NET.
Если же объект был создан в Singlethreaded Apartment (STA), то реально все действия с ним и созданными им объектами Внешнее соединение будут выполняться в одном потоке. В этом случае, если метод Connect не сможет на первом проходе найти подходящее или создать новое Внешнее соединение, то выполнение этого метода зациклится, так как освободить уже, возможно, ненужное другое Внешнее соединение будет нельзя по той причине, что операция освобождения объекта Внешнее соединение должна быть выполнена в том же потоке, в котором уже выполняется метод Connect.
Следует помнить, что создание COM-объектов из приложения 1C:Предприятие 8 выполняется из STA. Это же справедливо для большинства GUI-приложений Windows.
7 lucifer
 
08.05.15
12:25
(0)
"Пробывал и result.Exit() (Quit,Close,0,null) нечего не помогает"
вообщето-то в c# все что связано с внешнеми ресурсами должно быть реализовано через интерфейс IDisposable, посмотри COMConnector поддерживает этот интерфейс, если да то используй using() {}
а на result.Exit() и result = null;
8 Serginio1
 
08.05.15
12:27
Убери
com1s.PoolCapacity = 1;

                com1s.PoolTimeout = 1;

                com1s.MaxConnections = 1;
Кроме того можно через агента http://catalog.mista.ru/public/77671/
9 fierylions
 
08.05.15
14:01
Не один из вариантов не помог что то делаю не так.... база файловая может это как то повлиять?
10 Serginio1
 
08.05.15
14:34
А как ты видишь через список активных пользователей?
11 fierylions
 
08.05.15
15:18
12 fierylions
 
08.05.15
15:19
13 Serginio1
 
08.05.15
15:28
Вот ту народ пишет
http://www.sql.ru/forum/356825/kak-gramotno-zavershit-rabotu-s-1s


Dim Сотрудники As Object
....
Сотрудники = Trade.CreateObject("Справочник.Сотрудники")
'После объявлении любого объекта 1С надо  вставить:
Marshal.Release(Marshal.GetIDispatchForObject(Сотрудники))
....
'в конце кода добавляем:
Marshal.ReleaseComObject(Сотрудники)
Сотрудники = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
14 fierylions
 
08.05.15
16:05
(13) Спасибо большое строка помогла оборвать соединение:

Marshal.ReleaseComObject(result);

где "result" - моё соединение;
15 Serginio1
 
08.05.15
16:17
(14) Ачто FinalReleaseComObject не помогал?
16 fierylions
 
08.05.15
16:20
(15) нет соединение оставалось.
17 Serginio1
 
08.05.15
16:45
(16) Спасибо буду знать
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой