Timer.SynchronizingObject Eigenschap

Definitie

Hiermee haalt u het object op dat wordt gebruikt voor marshal event-handler-aanroepen die worden uitgegeven wanneer een interval is verstreken.

public:
 property System::ComponentModel::ISynchronizeInvoke ^ SynchronizingObject { System::ComponentModel::ISynchronizeInvoke ^ get(); void set(System::ComponentModel::ISynchronizeInvoke ^ value); };
[System.Timers.TimersDescription("TimerSynchronizingObject")]
public System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get; set; }
[System.Timers.TimersDescription("TimerSynchronizingObject")]
[System.ComponentModel.Browsable(false)]
public System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get; set; }
[<System.Timers.TimersDescription("TimerSynchronizingObject")>]
member this.SynchronizingObject : System.ComponentModel.ISynchronizeInvoke with get, set
[<System.Timers.TimersDescription("TimerSynchronizingObject")>]
[<System.ComponentModel.Browsable(false)>]
member this.SynchronizingObject : System.ComponentModel.ISynchronizeInvoke with get, set
Public Property SynchronizingObject As ISynchronizeInvoke

Waarde van eigenschap

Het ISynchronizeInvoke vertegenwoordigen van het object dat wordt gebruikt om de gebeurtenis-handler-aanroepen te marshalen die worden uitgegeven wanneer een interval is verstreken. De standaardwaarde is null.

Kenmerken

Voorbeelden

Het volgende voorbeeld is een Windows Forms-app die fungeert als een zeer eenvoudige tekstbestandseditor. Wanneer de tekst in het tekstvak niet is opgeslagen, vraagt de app de gebruiker met intervallen van één minuut of ze de inhoud van het tekstvak willen opslaan. Hiervoor is de Interval eigenschap ingesteld op één minuut (60.000 milliseconden) en wordt de SynchronizingObject eigenschap ingesteld op het Form object.

using System;
using System.IO;
using  Timers = System.Timers;
using System.Windows.Forms;
public partial class Form1 : Form
{
    Timers.Timer timer = null;
    StreamWriter sw = null;
    bool hasChanged = false;
    bool dialogIsOpen = false;
    int elapsedMinutes = 0;
    // Cache the text box cache internally without saving it.
    String txt = "";

    public Form1()
    {
        InitializeComponent();

        this.Text = "Quick Text Editor";
        button1.Text = "Save";
        textBox1.Multiline = true;

        // Configure the SaveFile dialog
        saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        saveFileDialog1.RestoreDirectory = true;

        // Create a timer with a 1-minute interval
        timer = new Timers.Timer(60000);
        // Define the event handler
        timer.Elapsed += this.PromptForSave;
        // Synchronize the timer with the text box
        timer.SynchronizingObject = this;
        // Start the timer
        timer.AutoReset = true;
    }

    private void PromptForSave(Object source, Timers.ElapsedEventArgs e)
    {
        if (hasChanged & (!dialogIsOpen)) {
            elapsedMinutes++;
            dialogIsOpen = true;
            if (MessageBox.Show(String.Format("{0} minutes have elapsed since the text was saved. Save it now? ",
                elapsedMinutes), "Save Text",
                MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                button1_Click(this, EventArgs.Empty);
                dialogIsOpen = false;
            }
        }
    }

    private void button1_Click(Object sender, EventArgs e)
    {
        if (String.IsNullOrEmpty(saveFileDialog1.FileName)) {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                sw = new StreamWriter(saveFileDialog1.FileName, false);
        }
        txt = textBox1.Text;
        hasChanged = false;
        timer.Stop();
    }

    private void form1_FormClosing(Object sender, FormClosingEventArgs e)
    {
        if (sw != null) {
            sw.Write(txt);
            sw.Close();
        }
    }

    private void textBox1_TextChanged(Object sender, EventArgs e)
    {
        hasChanged = true;
        timer.Start();
    }
}
Imports System.IO
Imports System.Timers

Public Class Form1
   ' Create the timer to fire at a 60-second interval.
   Dim WithEvents timer As New System.Timers.Timer(60000)
   Dim sw As StreamWriter
   Dim hasChanged As Boolean
   Dim dialogIsOpen As Boolean = False
   Dim elapsedMinutes As Integer = 0
   ' Cache the text box internally without saving it.
   Dim txt As String = ""

   Public Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
      Me.Text = "Quick Text Editor"
      Button1.Text = "Save"
      TextBox1.Multiline = True

      ' Configure the SaveFile dialog
      SaveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
      SaveFileDialog1.RestoreDirectory = True

      ' Create a timer with a 1-minute interval
      timer = New Timer(2000)
      ' Synchronize the timer with the text box
      timer.SynchronizingObject = Me
      ' Start the timer
      timer.AutoReset = True
   End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
      hasChanged = True
      timer.Start()
   End Sub
   Friend Sub PromptForSave(sender As Object, e As ElapsedEventArgs) _
      Handles timer.Elapsed
      If hasChanged And Not dialogIsOpen Then
         elapsedMinutes += 1
         dialogIsOpen = True
         If MsgBox(String.Format("{0} minutes have elapsed since the text was saved. Save it now? ",
                                 elapsedMinutes), MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question,
                   "Save Text") = MsgBoxResult.Yes Then
            If dialogIsOpen Then
               Button1_Click(Me, EventArgs.Empty)
               dialogIsOpen = False
            End If
         End If
      End If
   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      If String.IsNullOrEmpty(SaveFileDialog1.FileName) Then
         If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
            sw = New StreamWriter(SaveFileDialog1.FileName, False)
         End If
      End If
      txt = TextBox1.Text
      hasChanged = False
      elapsedMinutes = 0
      timer.Stop()
   End Sub

   Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
      If sw IsNot Nothing Then
         sw.Write(txt)
         sw.Close()
      End If
   End Sub
End Class

Voor het voorbeeld moet u de volgende besturingselementen toevoegen aan het formulier:

  • Een TextBox besturingselement met de naam TextBox1 (de standaardnaam).

  • Een Button besturingselement met de naam Button1 (de standaardnaam).

  • Een SaveFileDialog besturingselement met de naam SaveSaveFileDialog1 (de standaardnaam) .

Opmerkingen

Wanneer SynchronizingObject is nullde methode die de Elapsed gebeurtenis afhandelt, wordt aangeroepen op een thread uit de systeemthreadgroep. Zie voor meer informatie over systeemthreadpools ThreadPool.

Wanneer de gebeurtenis Elapsed wordt verwerkt door een visueel Windows Forms onderdeel, zoals een knop, kan het openen van het onderdeel via de systeemthreadgroep leiden tot een uitzondering of werkt dit mogelijk niet. Vermijd dit effect door SynchronizingObject in te stellen op een Windows Forms-onderdeel, waardoor de methode die de gebeurtenis Elapsed verwerkt, wordt aangeroepen op dezelfde thread waarop het onderdeel is gemaakt.

Note

Zelfs als de SynchronizingObject eigenschap niet nullis, Elapsed kunnen gebeurtenissen plaatsvinden nadat de Dispose of Stop methode is aangeroepen of nadat de Enabled eigenschap is ingesteld falseop , omdat het signaal voor het genereren van de gebeurtenis altijd in de Elapsed wachtrij staat voor uitvoering op een threadpoolthread. Een manier om deze racevoorwaarde op te lossen, is door een vlag in te stellen waarmee de gebeurtenis-handler voor de Elapsed gebeurtenis de volgende gebeurtenissen negeert.

Als de Timer in Visual Studio in een Windows Forms designer wordt gebruikt, wordt SynchronizingObject automatisch ingesteld op het besturingselement dat de Timer bevat. Als u bijvoorbeeld een ontwerpfunctie in een Timer ontwerpfunctie Form1 plaatst (waarvan deze overgaat Form), wordt de SynchronizingObject eigenschap ingesteld Timer op het exemplaar van Form1.

Van toepassing op

Zie ook