Timer.SynchronizingObject Właściwość

Definicja

Pobiera lub ustawia obiekt używany do marshalingu wywołań obsługi zdarzeń, które są wystawiane po upływie interwału.

public:
 property System::ComponentModel::ISynchronizeInvoke ^ SynchronizingObject { System::ComponentModel::ISynchronizeInvoke ^ get(); void set(System::ComponentModel::ISynchronizeInvoke ^ value); };
public System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get; set; }
public System.ComponentModel.ISynchronizeInvoke? SynchronizingObject { get; set; }
[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; }
member this.SynchronizingObject : System.ComponentModel.ISynchronizeInvoke with 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

Wartość właściwości

Obiekt ISynchronizeInvoke reprezentujący obiekt używany do marshalingu wywołań programu obsługi zdarzeń, które są wystawiane po upływie interwału. Wartość domyślna to null.

Atrybuty

Przykłady

Poniższy przykład to aplikacja Windows Forms, która służy jako bardzo prosty edytor plików tekstowych. Gdy tekst w polu tekstowym nie został zapisany, aplikacja pyta użytkownika w odstępach jednej minuty, czy chce zapisać zawartość pola tekstowego. W tym Interval celu właściwość jest ustawiona na jedną minutę (60 000 milisekund), a SynchronizingObject właściwość jest ustawiona na Form obiekt .

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

Przykład wymaga dodania następujących kontrolek do formularza:

  • Kontrolka TextBox o nazwie TextBox1 (nazwa domyślna).

  • Kontrolka Button o nazwie Button1 (nazwa domyślna).

  • Kontrolka SaveFileDialog o nazwie SaveSaveFileDialog1 (nazwa domyślna) .

Uwagi

Gdy SynchronizingObject parametr ma nullwartość , metoda, która obsługuje Elapsed zdarzenie, jest wywoływana w wątku z puli wątków systemowych. Aby uzyskać więcej informacji na temat pul wątków systemowych, zobacz ThreadPool.

Elapsed Jeśli zdarzenie jest obsługiwane przez składnik Windows Forms wizualizacji, taki jak przycisk, uzyskiwanie dostępu do składnika za pośrednictwem puli wątków systemowych może spowodować wyjątek lub po prostu może nie działać. Należy tego uniknąć, ustawiając SynchronizingObject składnik Windows Forms, co powoduje wywołanie metody obsługującej Elapsed zdarzenie w tym samym wątku, w którym został utworzony składnik.

Uwaga

Nawet jeśli SynchronizingObject właściwość nie nullma wartości , Elapsed zdarzenia mogą wystąpić po Dispose wywołaniu metody lub Stop lub po Enabled ustawieniu właściwości na falsewartość , ponieważ sygnał do podniesienia Elapsed zdarzenia jest zawsze w kolejce do wykonania w wątku puli wątków. Jednym ze sposobów rozwiązania tego warunku wyścigu jest ustawienie flagi, która nakazuje programowi obsługi Elapsed zdarzeń ignorowanie kolejnych zdarzeń.

Jeśli element Timer jest używany w programie Visual Studio w projektancie Windows Forms, SynchronizingObject zostanie automatycznie ustawiony na kontrolkę zawierającą element Timer. Jeśli na przykład umieścisz element Timer w projektancie Form1 (który dziedziczy z Formklasy ), SynchronizingObject właściwość obiektu Timer jest ustawiona na wystąpienie klasy Form1.

Dotyczy

Zobacz też