다음을 통해 공유


Timer.SynchronizingObject 속성

정의

시간 간격이 경과할 때 발행되는 이벤트 처리기 호출을 마샬링하는 데 사용되는 개체를 가져오거나 설정합니다.

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

속성 값

시간 간격이 경과할 때 발행되는 이벤트 처리기 호출을 마샬링하는 데 사용되는 개체를 나타내는 ISynchronizeInvoke입니다. 기본값은 null입니다.

특성

예제

다음 예제는 매우 간단한 텍스트 파일 편집기 역할을 하는 Windows Forms 앱입니다. 텍스트 상자의 텍스트가 저장되지 않은 경우 앱은 사용자에게 텍스트 상자의 내용을 저장할지 여부를 1분 간격으로 묻습니다. 이렇게 Interval 하려면 속성이 1분(60,000밀리초)으로 설정되고 SynchronizingObject 속성이 개체로 Form 설정됩니다.

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

이 예제에서는 양식에 다음 컨트롤을 추가해야 합니다.

  • TextBox 라는 TextBox1 컨트롤(기본 이름)입니다.

  • Button 라는 Button1 컨트롤(기본 이름)입니다.

  • SaveFileDialog 라는 SaveSaveFileDialog1 컨트롤(기본 이름) 입니다.

설명

가 인 null경우 SynchronizingObject 이벤트를 처리하는 Elapsed 메서드는 시스템 스레드 풀의 스레드에서 호출됩니다. 시스템 스레드 풀에 대한 자세한 내용은 를 참조하세요 ThreadPool.

Elapsed 단추와 같은 시각적 Windows Forms 구성 요소에서 이벤트를 처리하는 경우 시스템 스레드 풀을 통해 구성 요소에 액세스하면 예외가 발생하거나 작동하지 않을 수 있습니다. 구성 요소를 만든 스레드에서 이벤트를 처리하는 Elapsed 메서드를 호출하는 Windows Forms 구성 요소로 설정 SynchronizingObject 하여 이 효과를 방지합니다.

참고

속성이 SynchronizingObject 이 아니 nullElapsed 더라도 이벤트를 발생 Elapsed 하려면 false신호는 항상 스레드 풀 스레드에서 Dispose 실행 하기 위해 큐에 있기 때문에 또는 메서드가 호출 된 후 또는 Stop 속성이 로 설정 된 후 Enabled 이벤트가 발생할 수 있습니다. 이 경합 상태를 resolve 한 가지 방법은 이벤트 처리기에 후속 이벤트를 무시하도록 지시하는 플래그를 Elapsed 설정하는 것입니다.

Timer 가 Windows Forms 디자이너 SynchronizingObject 의 Visual Studio 내에서 사용되는 경우 는 가 포함된 컨트롤로 자동으로 설정됩니다Timer. 예를 들어 에 대 Form1 한 디자이너에 배치 Timer 하는 경우 (에서 FormSynchronizingObject 상속) 의 Timer 속성은 의 instance Form1설정 됩니다.

적용 대상

추가 정보