Backup, запрограммированный с timer, Трэды и Уполномоченные VB.NET

У меня есть система в vb.net, у которого есть функция HacerBackup() что включается кнопкой и сохраняет резервную копию базы данных в передвижном устройстве.

Потом клиент попросил у меня некие дни делаться автоматически периодически и там я появилась проблема с этими вопросами трэдов.

Следующий код находится в событии Form.Load, после каких-то IF (Если запрограммированный backup включен, что в дни он это сделает, и каждый как долго)

Dim tiempo As Integer = (CInt(TablaConfiguracion.Rows(10)(1)) * 60000) 'Intervalo en minutos
Timer_Backup.Interval = tiempo
Timer_Backup.Enabled = True

Потом в Timer_Backup_Tick я звоню в функцию HacerBackup ()

Private Sub Timer_Backup_Tick(sender As Object, e As EventArgs) Handles Timer_Backup.Tick
    HacerBackup()
End Sub

Но проблема состоит в том, что, когда он реализует backup (который занимает Ваше время), программа задерживается до тех пор, пока он не заканчивается. Я нуждаюсь в том, чтобы создать другой трэд background для того, чтобы он сделал сжатие данных и копию пока пользователь продолжает работать.

Поскольку у меня нет даже идеи о Multi-Threading, и что я нашел, он оказался мне непонятным я консультирую их, что методы, или из которого форма может делаться.


ИЗДАННЫЙ:

Я это решил используя "Аддандлер Тимер_баккуп. Elapsed, Аддрессоф Тимер_тикк" поскольку видят далее:

    '-----------------------------------------------------------------------------------'
    'Si esta activado el BACKUP PROGRAMADO llama a la funcion HacerBackup cada X minutos'
    '-----------------------------------------------------------------------------------'
    If TablaConfiguracion.Rows(9)(1) = True Then

        Dim dias As String() = TablaConfiguracion.Rows(11)(1).Split(",")
        Dim hoy As String = Today.DayOfWeek

        'Si esta tildado el dia en preferencias'
        If dias(hoy - 1) = "1" Then
            Dim tiempo As Integer = (CInt(TablaConfiguracion.Rows(10)(1)) * 60000) 'Intervalo en minutos'
            'Aquí creo el timer y le agrego como Handler.Elapsed la dirección de memoria del subproceso Timer_Tick'
            Timer_Backup = New System.Timers.Timer()
            AddHandler Timer_Backup.Elapsed, AddressOf Timer_Tick
            Timer_Backup.Interval = tiempo
            Timer_Backup.Enabled = True
        End If
    End If

Но мне ставит новое сомнение, у меня есть label в Form_Principal, который я хочу, что он показал дату и час последнего backup

    Shared Sub Timer_Tick(source As Object, e As System.Timers.ElapsedEventArgs)
    If HacerBackup() = True Then
        Dim ultimo_backup As String = e.SignalTime.ToString("dd/MM/yyyy - HH:mm")
        Form_Principal.Label_Principal_UltimoBK.Text = ultimo_backup
    End If
End Sub

Но выполнив преподавание, label не меняется. И если я помещаю ее, как лиши тебя, он возвращает мне следующее:

Не действительная операция через субпроцессы: Имелся доступ к контролю 'Label_Principal_UltimoBK' с субпроцесса, отличного от того, в котором он это создал.


ПОСЛЕДНИЙ EDIT: (И окончательное Решение)

Я это решил используя делегаты, как я показываю далее:

Уполномоченная функция:

Delegate Sub DelegadoCambiarLabel(ByVal texto As String)

Функция, которую меняет label:

Private Sub CambiarLabelBackup(ByVal texto As String)
    Me.Label_Principal_UltimoBK.Text = texto
End Sub

Добавляя его к функции, Названной в каждом Tick timer:

    Private Sub Timer_Tick(source As Object, e As System.Timers.ElapsedEventArgs)
    If HacerBackup() = True Then
        Dim ultimo_backup As String = e.SignalTime.ToString("dd/MM/yyyy - HH:mm")
        'Creamos una instancia del delegado, llamando a la función CambiarLabelBackup'
        Dim Delegado As New DelegadoCambiarLabel(AddressOf CambiarLabelBackup)
        'Invocamos esa instancia y le pasamos como objeto el string en cuestión'
        Me.Invoke(Delegado, New Object() {ultimo_backup})
        TablaConfiguracion(12)(1) = ultimo_backup
        EscribeINI()
    End If
End Sub

И voila! Совсем решенный. Спасибо.

3
задан 03.06.2016, 00:55
2 ответа

Может быть, это может помогать тебе, так как он выполняет то, что ты предлагаешь себе, если то, что ты ищешь, состоит в том, чтобы сохранять данные периодически (С контролем Timer):

Imports System.Threading
Imports System.Threading.Tasks
Imports System.Windows.Forms

Partial Public Class Form1 Inherits Form

    Private Sub Form1_Load(Sender As Object, e As EventArgs) Handles MyBase.Load
        ' ... 
    End Sub

    Private Sub Timer_Backup_Tick(Sender As Object, e As EventArgs) Handles Timer_Backup.Tick
        Dim Thr As New Thread(new ThreadStart(AddressOf BackupManager.HacerBackup))
        Thr.Start()
        ' Esto crea otra entrada para el metodo RealizarBackup y la ejecuta.
    End Sub

End Class

Главным образом, только создай другой ввод, чтобы реализовывать код в методе HacerBackup() и потом он это заканчивает.

В код возможно, что нужно делать ему договоренности, которые выйдут у тебя в Ошибке List Визуального Studio (я не VB.NET), но читабельная идея, также, я рекомендую тебе использовать timer System.Threading.

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

1
ответ дан 24.11.2019, 14:16
  • 1
    Если я также не соглашался поддерживать очень запрограммированный. Но это был negociaci и # 243; n между " Backup посредством click" который я предложил, и " Я хочу backup в каждый movimiento" как я pidi и # 243; клиент (который конечно не понимает того, что он значит backup). –  Gonzalo 31.05.2016, 17:15
  • 2
    Из-за готового я это решил с {Timer_Backup = Нев Систем. Timers. Timer (); Аддандлер Тимер_баккуп. Elapsed, Аддрессоф Асербаккуп} –  Gonzalo 31.05.2016, 17:16
  • 3
    Ну, приготовь ему это как desea и разработай versi и # 243; n, поскольку ты это выдвигаешь, и покажи ему различия между обоими вещами, поддержав с каждым click, ты будешь перегружать процессор с практически ненужными поступающими данными. Помни, что обучать твоего клиента - часть твоей работы! –  NaCl 31.05.2016, 17:48
  • 4
    Кларо Наси - именно то, что я объясняю ему, но - кость dif и # 237; cil грызения. У него нет justificaci и # 243; n делать спинку каждого движения, потому что tendr и # 237; в медленную программу и диск, перегруженный ненужными данными (что к тому же есть папка с im и # 225; гены каждого продукта). Я верю в то, что и #233; l выдвинь, что, изменив реестр, он написал себе в параллельной базе данных, если главная встречается, и # 241; в (что на писце). –  Gonzalo 02.06.2016, 19:17
  • 5
    Ense и # 241; ale, которое быть должен использовать какой-то RAID, backup из-за каждого шага не решение. –  gbianchi♦ 01.09.2016, 21:35

Я рекомендую тебе делать backup базы данных в отдельной программе, он больше, если возможно в услуге, что он инициализируется с системой, это multi threading так как, в c# выполнение метода timer_eplapsed делается в отдельном трэде, я не знаю, как он был в Визуальном Basic.net

здесь я оставляю тебе соединение в книгу (он на английском и ориентируемый в c#, но данный тому, что языки очень сходные, я представляю, что ты это сможешь приспосабливать в VB.net) Девелопинг Виндовс Сервисес Суксинктли, в котором он показывает тебе, как разрабатывать услуги для windows (Также такие знакомые как Услуги NT)

чтобы создавать новый thread или одинокий трэд ты должен использовать этот код:

Dim thread as New Thread( Sub() HacerBackup() End Sub ) thread.Start()

0
ответ дан 24.11.2019, 14:16
  • 1
    Дело в том, что это программа запаса, он не имеет много чувство, которое они делали бы backups, когда система не открыта и не est и # 225; n не делая ни движений статей ни ничего. Tendr и # 237; во многие файлы backup точно равные. Кроме того база данных (то, что сжимается и он сохраняет в extraible) - файл Access. –  Gonzalo 31.05.2016, 00:13
  • 2
    ahh, ok. я это представил в среде с механизмом базы данных как sql server или mysql, где другие рабочие станции могли бы изменять базу данных. –  Bloodday 31.05.2016, 00:16
  • 3
    Dim thread as New Thread( Sub() HacerBackup() End Sub ) thread.Start() –  Bloodday 31.05.2016, 00:17
  • 4
    помести эту линию кода в eplapsed timer –  Bloodday 31.05.2016, 00:17
  • 5
    @Bloodday porfavor издай ответ с informaci и # 243; n, что в и # 241; adido в конце концов, схвати и # 237; все могут видеть ее в мгновение, и помести informaci и # 243; n значимый соединения для того, чтобы если один d и # 237; в es соединение падает, informaci и # 243; n смогите быть aqu и # 237;. –  NaCl 31.05.2016, 05:55