Timer.SynchronizingObject Timer.SynchronizingObject Timer.SynchronizingObject Timer.SynchronizingObject Property

定義

指定した間隔が経過したときに発行されるイベント ハンドラー呼び出しをマーシャリングするために使用するオブジェクトを取得または設定します。Gets or sets the object used to marshal event-handler calls that are issued when an interval has elapsed.

public:
 property System::ComponentModel::ISynchronizeInvoke ^ SynchronizingObject { System::ComponentModel::ISynchronizeInvoke ^ get(); void set(System::ComponentModel::ISynchronizeInvoke ^ value); };
[System.ComponentModel.Browsable(false)]
[System.Timers.TimersDescription("The object used to marshal the event handler calls issued when an interval has elapsed.")]
[System.Timers.TimersDescription("TimerSynchronizingObject")]
public System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get; set; }
member this.SynchronizingObject : System.ComponentModel.ISynchronizeInvoke with get, set
Public Property SynchronizingObject As ISynchronizeInvoke

プロパティ値

指定した間隔が経過したときに発行されるイベント ハンドラー呼び出しをマーシャリングするために使用するオブジェクトを表す ISynchronizeInvokeThe ISynchronizeInvoke representing the object used to marshal the event-handler calls that are issued when an interval has elapsed. 既定値は、null です。The default is null.

次の例は、非常に単純なテキストファイルエディターとして機能する Windows フォームアプリです。The following example is a Windows Forms app that serves as a very simple text file editor. テキストボックス内のテキストが保存されていない場合、アプリケーションは、テキストボックスの内容を保存するかどうかを1分間隔でユーザーに要求します。When the text in the text box has not been saved, the app asks the user at one-minute intervals whether he or she wants to save the contents of the text box. これIntervalを行うには、プロパティが1分 (6万ミリ秒) SynchronizingObjectに設定され、 Formプロパティがオブジェクトに設定されます。To do this, the Interval property is set to one minute (60,000 milliseconds), and the SynchronizingObject property is set to the 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

この例では、次のコントロールをフォームに追加する必要があります。The example requires that you add the following controls to the form:

  • という名前TextBox1のコントロール(既定の名前)。TextBoxA TextBox control named TextBox1 (its default name).

  • という名前Button1のコントロール(既定の名前)。ButtonA Button control named Button1 (its default name).

  • という名前SaveSaveFileDialog1のコントロール(既定の名前)。SaveFileDialogA SaveFileDialog control named SaveSaveFileDialog1 (its default name) .

注釈

SynchronizingObject Elapsedの場合、イベントを処理するメソッドは、システムスレッドプールからのスレッドで呼び出されます。 nullWhen SynchronizingObject is null, the method that handles the Elapsed event is called on a thread from the system-thread pool. システムスレッドプールの詳細については、 ThreadPool「」を参照してください。For more information on system-thread pools, see ThreadPool.

ボタンなどのビジュアル Windows フォームコンポーネントによってイベントが処理される場合、システムスレッドプールを介してコンポーネントにアクセスすると、例外が発生するか、または機能しない可能性があります。ElapsedWhen the Elapsed event is handled by a visual Windows Forms component, such as a button, accessing the component through the system-thread pool might result in an exception or just might not work. この効果を回避するSynchronizingObjectには、を Windows フォームコンポーネントに設定します。これElapsedにより、イベントを処理するメソッドが、コンポーネントが作成されたのと同じスレッドで呼び出されます。Avoid this effect by setting SynchronizingObject to a Windows Forms component, which causes the method that handles the Elapsed event to be called on the same thread that the component was created on.

注意

SynchronizingObjectプロパティがでないnull場合でもElapsed 、メソッドDisposeまたStopはメソッドが呼び出された後、またはEnabledプロパティがにfalse設定された後にイベントが発生することがあります。これは、発生するシグナルであるためです。イベントElapsedは、スレッドプールのスレッドで実行するために常にキューに登録されます。Even if the SynchronizingObject property is not null, Elapsed events can occur after the Dispose or Stop method has been called or after the Enabled property has been set to false, because the signal to raise the Elapsed event is always queued for execution on a thread pool thread. この競合状態がのイベント ハンドラーを示すフラグを設定するには解決するのには 1 つのメソッド、Elapsed後続のイベントを無視するイベントです。One way to resolve this race condition is to set a flag that tells the event handler for the Elapsed event to ignore subsequent events.

が Visual Studio 内で Windows フォームデザイナーで使用されてSynchronizingObjectいる場合、はを含むTimerコントロールに自動的に設定されます。 TimerIf the Timer is used inside Visual Studio in a Windows Forms designer, SynchronizingObject is automatically set to the control that contains the Timer. たとえば、を (からTimer Form Form1 Timer 継承するForm1) のデザイナーに配置すると、のプロパティはのインスタンスに設定されます。SynchronizingObjectFor example, if you place a Timer on a designer for Form1 (which inherits from Form), the SynchronizingObject property of Timer is set to the instance of Form1.

適用対象

こちらもご覧ください