Я работаю над проектом VBA, в котором для обработки асинхронных задач используется класс WithEvents. Эти задачи управляются COM-объектом (библиотека C# DLL), который обеспечивает функциональность выполнения задач. Я поддерживаю коллекцию обработчиков, где каждый обработчик представляет экземпляр класса с WithEvents. Вот упрощенная версия кода: Класс Task Runner:
Option Compare Database
Option Explicit
Public WithEvents taskRunner As ComEventTest.taskRunner
Private Sub taskRunner_OnTaskCompleted(ByVal result As String)
' Handle task completion
Debug.Print result
End Sub
Public Sub InitializeTaskRunner()
Set taskRunner = New ComEventTest.taskRunner
End Sub
Public Sub FireEvent(poraka As String)
taskRunner.RunTask poraka
End Sub
Option Compare Database
Option Explicit
Dim eventHandlers As Collection
Sub InitializeEventHandlers()
Set eventHandlers = New Collection
End Sub
Sub TestTaskRunner(Optional retr As String)
If eventHandlers Is Nothing Then
InitializeEventHandlers
End If
Dim newEventHandler As TaskRunnerEventHandler
Set newEventHandler = New TaskRunnerEventHandler
newEventHandler.InitializeTaskRunner
eventHandlers.Add newEventHandler
' Fire tasks
Dim i As Integer
For i = 1 To 3
newEventHandler.FireEvent "Task " & retr & "-" & i
Sleep 100 ' Simulate delay for async task running
Debug.Print "Task " & retr & "-" & i & " is running asynchronously!"
Next i
End Sub
Sub TestTaskRunner_MultCalls()
Dim i As Integer
For i = 1 To 3
Debug.Print "New CALL SUB fire " & i
TestTaskRunner CStr(i)
Sleep 500 ' Simulate delay between multiple calls
Next i
End Sub
Мой вопрос: Должен ли я очистить завершенные обработчики из коллекции eventHandlers?< /strong>
Я использую COM-объект (DLL C#) для обработки асинхронных задач и заметил, что задачи могут завершиться асинхронно. Мне интересно, не приведет ли оставление этих обработчиков в коллекции со временем к проблемам с памятью.
Примечания:< /em>
Каждый экземпляр обработчика оборачивает асинхронную задачу с помощью WithEvents.
Событие TaskRunner_OnTaskCompleted срабатывает после завершения задачи .
COM Объект представляет собой DLL C#, которая предоставляет объект TaskRunner и его события VBA.
Я мог бы реализовать флаг (например, isCompleted) в классе обработчика, но я не уверен, что это будет лучше практика динамического удаления завершенных обработчиков.
Каков рекомендуемый подход в этом сценарии? Что лучше — хранить все обработчики в коллекции или периодически их очищать? Стоит ли в этом случае полагаться на какие-то конкретные шаблоны взаимодействия с COM-объектами?
Я работаю над проектом VBA, в котором для обработки асинхронных задач используется класс WithEvents. Эти задачи управляются COM-объектом (библиотека C# DLL), который обеспечивает функциональность выполнения задач. Я поддерживаю коллекцию обработчиков, где каждый обработчик представляет экземпляр класса с WithEvents. Вот упрощенная версия кода: [b]Класс Task Runner:[/b] [code]Option Compare Database Option Explicit
Public WithEvents taskRunner As ComEventTest.taskRunner
Private Sub taskRunner_OnTaskCompleted(ByVal result As String) ' Handle task completion Debug.Print result End Sub
Public Sub InitializeTaskRunner() Set taskRunner = New ComEventTest.taskRunner End Sub
Public Sub FireEvent(poraka As String) taskRunner.RunTask poraka End Sub [/code] [b]Модуль использования:[/b] [code]Option Compare Database Option Explicit
Dim eventHandlers As Collection
Sub InitializeEventHandlers() Set eventHandlers = New Collection End Sub
Sub TestTaskRunner(Optional retr As String) If eventHandlers Is Nothing Then InitializeEventHandlers End If
Dim newEventHandler As TaskRunnerEventHandler Set newEventHandler = New TaskRunnerEventHandler
' Fire tasks Dim i As Integer For i = 1 To 3 newEventHandler.FireEvent "Task " & retr & "-" & i Sleep 100 ' Simulate delay for async task running Debug.Print "Task " & retr & "-" & i & " is running asynchronously!" Next i End Sub
Sub TestTaskRunner_MultCalls() Dim i As Integer For i = 1 To 3 Debug.Print "New CALL SUB fire " & i TestTaskRunner CStr(i) Sleep 500 ' Simulate delay between multiple calls Next i End Sub [/code] [b]Мой вопрос:[/b] [b]Должен ли я очистить завершенные обработчики из коллекции eventHandlers?< /strong> [list] [*]Я использую COM-объект (DLL C#) для обработки асинхронных задач и заметил, что задачи могут завершиться асинхронно. Мне интересно, не приведет ли оставление этих обработчиков в коллекции со временем к проблемам с памятью. [/list] Примечания:[/b]< /em> [list] [*]Каждый экземпляр обработчика оборачивает асинхронную задачу с помощью WithEvents. [*]Событие TaskRunner_OnTaskCompleted срабатывает после завершения задачи . [*]COM Объект представляет собой DLL C#, которая предоставляет объект TaskRunner и его события VBA. [*]Я мог бы реализовать флаг (например, isCompleted) в классе обработчика, но я не уверен, что это будет лучше практика динамического удаления завершенных обработчиков. [/list] Каков рекомендуемый подход в этом сценарии? Что лучше — хранить все обработчики в коллекции или периодически их очищать? Стоит ли в этом случае полагаться на какие-то конкретные шаблоны взаимодействия с COM-объектами?
Я работаю над проектом VBA, в котором для обработки асинхронных задач используется класс WithEvents. Эти задачи управляются COM-объектом (библиотека C# DLL), который обеспечивает функциональность выполнения задач. Я поддерживаю коллекцию...
Я работаю над проектом VBA, в котором для обработки асинхронных задач используется класс WithEvents. Эти задачи управляются COM-объектом (библиотека C# DLL), который обеспечивает функциональность выполнения задач. Я поддерживаю коллекцию...
Я пытаюсь использовать DLL C# в VBA с событиями, используя атрибут , но столкнулся с проблемами. Вот что у меня есть на данный момент:
Код C#
ITaskRunnerEvents.cs
using System;
using System.Runtime.InteropServices;
Я пытаюсь использовать DLL C# в VBA с событиями, используя атрибут , но столкнулся с проблемами. Вот что у меня есть на данный момент:
Код C#
ITaskRunnerEvents.cs
using System;
using System.Runtime.InteropServices;
Я работаю над проектом VBA, который будет вставлять модуль в другую книгу Excel, для незащищенной книги это происходит, но с защищенной книгой я не могу этого сделать, у меня тоже есть пароль, может кто-нибудь подскажите мне, как это сделать с...