|
В 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) Спасибо буду знать
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |