Application.Run Methode

Definitie

Begint met het uitvoeren van een standaardtoepassingsberichtlus op de huidige thread.

Overloads

Name Description
Run()

Begint met het uitvoeren van een standaardtoepassingsberichtlus op de huidige thread, zonder een formulier.

Run(ApplicationContext)

Begint met het uitvoeren van een standaardtoepassingsberichtlus op de huidige thread, met een ApplicationContext.

Run(Form)

Begint met het uitvoeren van een standaardtoepassingsberichtlus op de huidige thread en maakt het opgegeven formulier zichtbaar.

Run()

Begint met het uitvoeren van een standaardtoepassingsberichtlus op de huidige thread, zonder een formulier.

public:
 static void Run();
public static void Run();
static member Run : unit -> unit
Public Shared Sub Run ()

Uitzonderingen

Er wordt al een hoofdberichtlus uitgevoerd op deze thread.

Opmerkingen

In een Win32-toepassing of Windows Forms is een berichtenlus een routine in code die gebruikersgebeurtenissen verwerkt, zoals muisklikken en toetsenbordstreken. Elke actieve toepassing op basis van Windows vereist een actieve berichtlus, de hoofdberichtlus genoemd. Wanneer de hoofdberichtlus is gesloten, wordt de toepassing afgesloten. In Windows Forms wordt deze lus gesloten wanneer de methode Exit wordt aangeroepen, of wanneer de methode ExitThread wordt aangeroepen op de thread waarop de hoofdberichtlus wordt uitgevoerd.

De meeste Windows Forms ontwikkelaars hoeven deze versie van de methode niet te gebruiken. U moet de Run(Form) overbelasting gebruiken om een toepassing te starten met een hoofdformulier, zodat de toepassing wordt beëindigd wanneer het hoofdformulier wordt gesloten. Gebruik voor alle andere situaties de Run(ApplicationContext) overbelasting, die ondersteuning biedt voor het leveren van een ApplicationContext object voor betere controle over de levensduur van de toepassing.

Zie ook

Van toepassing op

Run(ApplicationContext)

Begint met het uitvoeren van een standaardtoepassingsberichtlus op de huidige thread, met een ApplicationContext.

public:
 static void Run(System::Windows::Forms::ApplicationContext ^ context);
public static void Run(System.Windows.Forms.ApplicationContext context);
static member Run : System.Windows.Forms.ApplicationContext -> unit
Public Shared Sub Run (context As ApplicationContext)

Parameters

context
ApplicationContext

Een ApplicationContext toepassing waarin de toepassing wordt uitgevoerd.

Uitzonderingen

Er wordt al een hoofdberichtlus uitgevoerd op deze thread.

Voorbeelden

In het voorbeeld worden twee formulieren weergegeven en wordt de toepassing afgesloten wanneer beide formulieren zijn gesloten. Wanneer de toepassing wordt gestart en afgesloten, wordt de positie van elk formulier onthouden. In dit voorbeeld ziet u hoe u een ApplicationContext, samen met de Application.Run(context) methode, gebruikt om meerdere formulieren weer te geven wanneer de toepassing wordt gestart.

De klasse MyApplicationContext neemt gegevens over van ApplicationContext en houdt bij wanneer elk formulier wordt gesloten en sluit de huidige thread af wanneer ze beide zijn. De klasse slaat de posities van elk formulier voor de gebruiker op. De positiegegevens van het formulier worden opgeslagen in een bestand met Appdata.txt de titel dat wordt gemaakt op de locatie die wordt bepaald door UserAppDataPath. Met de Main methode wordt aangeroepen Application.Run(context) om de toepassing te starten op basis van de ApplicationContext.

De code voor de AppForm1 en AppForm2 formulieren wordt niet weergegeven met het oog op beknoptheid. Bekijk het ApplicationContext klassenoverzicht voor de hele codevermelding.

// The class that handles the creation of the application windows
ref class MyApplicationContext: public ApplicationContext
{
private:
   int _formCount;
   AppForm1^ _form1;
   AppForm2^ _form2;
   System::Drawing::Rectangle _form1Position;
   System::Drawing::Rectangle _form2Position;
   FileStream^ _userData;

public:

   MyApplicationContext()
   {
      _formCount = 0;
      
      // Handle the ApplicationExit event to know when the application is exiting.
      Application::ApplicationExit += gcnew EventHandler( this, &MyApplicationContext::OnApplicationExit );
      try
      {
         
         // Create a file that the application will store user specific data in.
         _userData = gcnew FileStream( String::Concat( Application::UserAppDataPath, "\\appdata.txt" ),FileMode::OpenOrCreate );
      }
      catch ( IOException^ e ) 
      {
         
         // Inform the user that an error occurred.
         MessageBox::Show( "An error occurred while attempting to show the application. The error is: {0}", dynamic_cast<String^>(e) );
         
         // Exit the current thread instead of showing the windows.
         ExitThread();
      }

      
      // Create both application forms and handle the Closed event
      // to know when both forms are closed.
      _form1 = gcnew AppForm1;
      _form1->Closed += gcnew EventHandler( this, &MyApplicationContext::OnFormClosed );
      _form1->Closing += gcnew CancelEventHandler( this, &MyApplicationContext::OnFormClosing );
      _formCount++;
      _form2 = gcnew AppForm2;
      _form2->Closed += gcnew EventHandler( this, &MyApplicationContext::OnFormClosed );
      _form2->Closing += gcnew CancelEventHandler( this, &MyApplicationContext::OnFormClosing );
      _formCount++;
      
      // Get the form positions based upon the user specific data.
      if ( ReadFormDataFromFile() )
      {
         
         // If the data was read from the file, set the form
         // positions manually.
         _form1->StartPosition = FormStartPosition::Manual;
         _form2->StartPosition = FormStartPosition::Manual;
         _form1->Bounds = _form1Position;
         _form2->Bounds = _form2Position;
      }

      
      // Show both forms.
      _form1->Show();
      _form2->Show();
   }

   void OnApplicationExit( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      
      // When the application is exiting, write the application data to the
      // user file and close it.
      WriteFormDataToFile();
      try
      {
         
         // Ignore any errors that might occur while closing the file handle.
         _userData->Close();
      }
      catch ( Exception^ ) 
      {
      }

   }

private:

   void OnFormClosing( Object^ sender, CancelEventArgs^ /*e*/ )
   {
      
      // When a form is closing, remember the form position so it
      // can be saved in the user data file.
      if ( dynamic_cast<AppForm1^>(sender) != nullptr )
            _form1Position = (dynamic_cast<Form^>(sender))->Bounds;
      else
      if ( dynamic_cast<AppForm1^>(sender) != nullptr )
            _form2Position = (dynamic_cast<Form^>(sender))->Bounds;
   }

   void OnFormClosed( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      
      // When a form is closed, decrement the count of open forms.
      // When the count gets to 0, exit the app by calling
      // ExitThread().
      _formCount--;
      if ( _formCount == 0 )
      {
         ExitThread();
      }
   }

   bool WriteFormDataToFile()
   {
      
      // Write the form positions to the file.
      UTF8Encoding^ encoding = gcnew UTF8Encoding;
      RectangleConverter^ rectConv = gcnew RectangleConverter;
      String^ form1pos = rectConv->ConvertToString( _form1Position );
      String^ form2pos = rectConv->ConvertToString( _form2Position );
      array<Byte>^dataToWrite = encoding->GetBytes( String::Concat( "~", form1pos, "~", form2pos ) );
      try
      {
         
         // Set the write position to the start of the file and write
         _userData->Seek( 0, SeekOrigin::Begin );
         _userData->Write( dataToWrite, 0, dataToWrite->Length );
         _userData->Flush();
         _userData->SetLength( dataToWrite->Length );
         return true;
      }
      catch ( Exception^ ) 
      {
         
         // An error occurred while attempting to write, return false.
         return false;
      }

   }

   bool ReadFormDataFromFile()
   {
      
      // Read the form positions from the file.
      UTF8Encoding^ encoding = gcnew UTF8Encoding;
      String^ data;
      if ( _userData->Length != 0 )
      {
         array<Byte>^dataToRead = gcnew array<Byte>(_userData->Length);
         try
         {
            
            // Set the read position to the start of the file and read.
            _userData->Seek( 0, SeekOrigin::Begin );
            _userData->Read( dataToRead, 0, dataToRead->Length );
         }
         catch ( IOException^ e ) 
         {
            String^ errorInfo = dynamic_cast<String^>(e);
            
            // An error occurred while attempt to read, return false.
            return false;
         }
         
         // Parse out the data to get the window rectangles
         data = encoding->GetString( dataToRead );
         try
         {
            
            // Convert the String* data to rectangles
            RectangleConverter^ rectConv = gcnew RectangleConverter;
            String^ form1pos = data->Substring( 1, data->IndexOf( "~", 1 ) - 1 );
            _form1Position =  *safe_cast<Rectangle^>(rectConv->ConvertFromString( form1pos ));
            String^ form2pos = data->Substring( data->IndexOf( "~", 1 ) + 1 );
            _form2Position =  *safe_cast<Rectangle^>(rectConv->ConvertFromString( form2pos ));
            return true;
         }
         catch ( Exception^ ) 
         {
            
            // Error occurred while attempting to convert the rectangle data.
            // Return false to use default values.
            return false;
         }
      }
      else
      {
         
         // No data in the file, return false to use default values.
         return false;
      }
   }
};
// The class that handles the creation of the application windows
class MyApplicationContext : ApplicationContext
{

    private int _formCount;
    private AppForm1 _form1;
    private AppForm2 _form2;

    private Rectangle _form1Position;
    private Rectangle _form2Position;

    private FileStream _userData;

    private MyApplicationContext()
    {
        _formCount = 0;

        // Handle the ApplicationExit event to know when the application is exiting.
        Application.ApplicationExit += new EventHandler(this.OnApplicationExit);

        try
        {
            // Create a file that the application will store user specific data in.
            _userData = new FileStream(Application.UserAppDataPath + "\\appdata.txt", FileMode.OpenOrCreate);
        }
        catch (IOException e)
        {
            // Inform the user that an error occurred.
            MessageBox.Show("An error occurred while attempting to show the application." +
                            "The error is:" + e.ToString());

            // Exit the current thread instead of showing the windows.
            ExitThread();
        }

        // Create both application forms and handle the Closed event
        // to know when both forms are closed.
        _form1 = new AppForm1();
        _form1.Closed += new EventHandler(OnFormClosed);
        _form1.Closing += new CancelEventHandler(OnFormClosing);
        _formCount++;

        _form2 = new AppForm2();
        _form2.Closed += new EventHandler(OnFormClosed);
        _form2.Closing += new CancelEventHandler(OnFormClosing);
        _formCount++;

        // Get the form positions based upon the user specific data.
        if (ReadFormDataFromFile())
        {
            // If the data was read from the file, set the form
            // positions manually.
            _form1.StartPosition = FormStartPosition.Manual;
            _form2.StartPosition = FormStartPosition.Manual;

            _form1.Bounds = _form1Position;
            _form2.Bounds = _form2Position;
        }

        // Show both forms.
        _form1.Show();
        _form2.Show();
    }

    private void OnApplicationExit(object sender, EventArgs e)
    {
        // When the application is exiting, write the application data to the
        // user file and close it.
        WriteFormDataToFile();

        try
        {
            // Ignore any errors that might occur while closing the file handle.
            _userData.Close();
        }
        catch { }
    }

    private void OnFormClosing(object sender, CancelEventArgs e)
    {
        // When a form is closing, remember the form position so it
        // can be saved in the user data file.
        if (sender is AppForm1)
            _form1Position = ((Form)sender).Bounds;
        else if (sender is AppForm2)
            _form2Position = ((Form)sender).Bounds;
    }

    private void OnFormClosed(object sender, EventArgs e)
    {
        // When a form is closed, decrement the count of open forms.

        // When the count gets to 0, exit the app by calling
        // ExitThread().
        _formCount--;
        if (_formCount == 0)
        {
            ExitThread();
        }
    }

    private bool WriteFormDataToFile()
    {
        // Write the form positions to the file.
        UTF8Encoding encoding = new UTF8Encoding();

        RectangleConverter rectConv = new RectangleConverter();
        string form1pos = rectConv.ConvertToString(_form1Position);
        string form2pos = rectConv.ConvertToString(_form2Position);

        byte[] dataToWrite = encoding.GetBytes("~" + form1pos + "~" + form2pos);

        try
        {
            // Set the write position to the start of the file and write
            _userData.Seek(0, SeekOrigin.Begin);
            _userData.Write(dataToWrite, 0, dataToWrite.Length);
            _userData.Flush();

            _userData.SetLength(dataToWrite.Length);
            return true;
        }
        catch
        {
            // An error occurred while attempting to write, return false.
            return false;
        }
    }

    private bool ReadFormDataFromFile()
    {
        // Read the form positions from the file.
        UTF8Encoding encoding = new UTF8Encoding();
        string data;

        if (_userData.Length != 0)
        {
            byte[] dataToRead = new byte[_userData.Length];

            try
            {
                // Set the read position to the start of the file and read.
                _userData.Seek(0, SeekOrigin.Begin);
                _userData.Read(dataToRead, 0, dataToRead.Length);
            }
            catch (IOException e)
            {
                string errorInfo = e.ToString();
                // An error occurred while attempt to read, return false.
                return false;
            }

            // Parse out the data to get the window rectangles
            data = encoding.GetString(dataToRead);

            try
            {
                // Convert the string data to rectangles
                RectangleConverter rectConv = new RectangleConverter();
                string form1pos = data.Substring(1, data.IndexOf("~", 1) - 1);

                _form1Position = (Rectangle)rectConv.ConvertFromString(form1pos);

                string form2pos = data.Substring(data.IndexOf("~", 1) + 1);
                _form2Position = (Rectangle)rectConv.ConvertFromString(form2pos);

                return true;
            }
            catch
            {
                // Error occurred while attempting to convert the rectangle data.
                // Return false to use default values.
                return false;
            }
        }
        else
        {
            // No data in the file, return false to use default values.
            return false;
        }
    }

    [STAThread]
    static void Main(string[] args)
    {

        // Create the MyApplicationContext, that derives from ApplicationContext,
        // that manages when the application should exit.

        MyApplicationContext context = new MyApplicationContext();

        // Run the application with the specific context. It will exit when
        // all forms are closed.
        Application.Run(context);
    }
}
' The class that handles the creation of the application windows
Public Class MyApplicationContext
    Inherits ApplicationContext

    Private _formCount As Integer
    Private _form1 As AppForm1
    Private _form2 As AppForm2

    Private _form1Position As Rectangle
    Private _form2Position As Rectangle

    Private _userData As FileStream

    Public Sub New()
        MyBase.New()
        _formCount = 0

        ' Handle the ApplicationExit event to know when the application is exiting.
        AddHandler Application.ApplicationExit, AddressOf OnApplicationExit

        Try
            ' Create a file that the application will store user specific data in.
            _userData = New FileStream(Application.UserAppDataPath + "\appdata.txt", FileMode.OpenOrCreate)

        Catch e As IOException
            ' Inform the user that an error occurred.
            MessageBox.Show("An error occurred while attempting to show the application." +
                            "The error is:" + e.ToString())

            ' Exit the current thread instead of showing the windows.
            ExitThread()
        End Try

        ' Create both application forms and handle the Closed event
        ' to know when both forms are closed.
        _form1 = New AppForm1()
        AddHandler _form1.Closed, AddressOf OnFormClosed
        AddHandler _form1.Closing, AddressOf OnFormClosing
        _formCount = _formCount + 1

        _form2 = New AppForm2()
        AddHandler _form2.Closed, AddressOf OnFormClosed
        AddHandler _form2.Closing, AddressOf OnFormClosing
        _formCount = _formCount + 1

        ' Get the form positions based upon the user specific data.
        If (ReadFormDataFromFile()) Then
            ' If the data was read from the file, set the form
            ' positions manually.
            _form1.StartPosition = FormStartPosition.Manual
            _form2.StartPosition = FormStartPosition.Manual

            _form1.Bounds = _form1Position
            _form2.Bounds = _form2Position
        End If

        ' Show both forms.
        _form1.Show()
        _form2.Show()
    End Sub

    Private Sub OnApplicationExit(ByVal sender As Object, ByVal e As EventArgs)
        ' When the application is exiting, write the application data to the
        ' user file and close it.
        WriteFormDataToFile()

        Try
            ' Ignore any errors that might occur while closing the file handle.
            _userData.Close()
        Catch
        End Try
    End Sub

    Private Sub OnFormClosing(ByVal sender As Object, ByVal e As CancelEventArgs)
        ' When a form is closing, remember the form position so it
        ' can be saved in the user data file.
        If TypeOf sender Is AppForm1 Then
            _form1Position = CType(sender, Form).Bounds
        ElseIf TypeOf sender Is AppForm2 Then
            _form2Position = CType(sender, Form).Bounds
        End If
    End Sub

    Private Sub OnFormClosed(ByVal sender As Object, ByVal e As EventArgs)
        ' When a form is closed, decrement the count of open forms.

        ' When the count gets to 0, exit the app by calling
        ' ExitThread().
        _formCount = _formCount - 1
        If (_formCount = 0) Then
            ExitThread()
        End If
    End Sub

    Private Function WriteFormDataToFile() As Boolean
        ' Write the form positions to the file.
        Dim encoding As UTF8Encoding = New UTF8Encoding()

        Dim rectConv As RectangleConverter = New RectangleConverter()
        Dim form1pos As String = rectConv.ConvertToString(_form1Position)
        Dim form2pos As String = rectConv.ConvertToString(_form2Position)

        Dim dataToWrite As Byte() = encoding.GetBytes("~" + form1pos + "~" + form2pos)

        Try
            ' Set the write position to the start of the file and write
            _userData.Seek(0, SeekOrigin.Begin)
            _userData.Write(dataToWrite, 0, dataToWrite.Length)
            _userData.Flush()

            _userData.SetLength(dataToWrite.Length)
            Return True

        Catch
            ' An error occurred while attempting to write, return false.
            Return False
        End Try

    End Function

    Private Function ReadFormDataFromFile() As Boolean
        ' Read the form positions from the file.
        Dim encoding As UTF8Encoding = New UTF8Encoding()
        Dim data As String

        If (_userData.Length <> 0) Then
            Dim dataToRead(_userData.Length) As Byte

            Try
                ' Set the read position to the start of the file and read.
                _userData.Seek(0, SeekOrigin.Begin)
                _userData.Read(dataToRead, 0, dataToRead.Length)

            Catch e As IOException
                Dim errorInfo As String = e.ToString()
                ' An error occurred while attempt to read, return false.
                Return False
            End Try

            ' Parse out the data to get the window rectangles
            data = encoding.GetString(dataToRead)

            Try
                ' Convert the string data to rectangles
                Dim rectConv As RectangleConverter = New RectangleConverter()
                Dim form1pos As String = data.Substring(1, data.IndexOf("~", 1) - 1)

                _form1Position = CType(rectConv.ConvertFromString(form1pos), Rectangle)

                Dim form2pos As String = data.Substring(data.IndexOf("~", 1) + 1)
                _form2Position = CType(rectConv.ConvertFromString(form2pos), Rectangle)

                Return True

            Catch
                ' Error occurred while attempting to convert the rectangle data.
                ' Return false to use default values.
                Return False
            End Try

        Else
            ' No data in the file, return false to use default values.
            Return False
        End If
    End Function

End Class

Public Module MyApplication
    Public Sub Main()
        ' Create the MyApplicationContext, that derives from ApplicationContext,
        ' that manages when the application should exit.

        Dim context As MyApplicationContext = New MyApplicationContext()

        ' Run the application with the specific context. It will exit when
        ' all forms are closed.
        Application.Run(context)
    End Sub
End Module

Opmerkingen

De berichtlus wordt uitgevoerd tot Exit of wordt aangeroepen of ExitThread de ThreadExit gebeurtenis wordt gegenereerd op het contextobject.

Zie ook

Van toepassing op

Run(Form)

Begint met het uitvoeren van een standaardtoepassingsberichtlus op de huidige thread en maakt het opgegeven formulier zichtbaar.

public:
 static void Run(System::Windows::Forms::Form ^ mainForm);
public static void Run(System.Windows.Forms.Form mainForm);
static member Run : System.Windows.Forms.Form -> unit
Public Shared Sub Run (mainForm As Form)

Parameters

mainForm
Form

Een Form die het formulier vertegenwoordigt om zichtbaar te maken.

Uitzonderingen

Er wordt al een hoofdberichtlus uitgevoerd op de huidige thread.

Voorbeelden

Het volgende codevoorbeeld bevat getallen in een keuzelijst op een formulier. Telkens wanneer u klikt button1, voegt de toepassing een ander nummer toe aan de lijst.

Met de Main methode wordt aangeroepen Run om de toepassing te starten, waarmee het formulier wordt gemaakt, listBox1en button1. Wanneer de gebruiker klikt button1, wordt met de button1_Click methode één tot drie getallen aan de keuzelijst toegevoegd en wordt een MessageBox. Als de gebruiker op Nee klikt, MessageBoxwordt met de button1_Click methode een ander nummer aan de lijst toegevoegd. Als de gebruiker op Ja klikt, roept Exit de toepassing aan om alle resterende berichten in de wachtrij te verwerken en vervolgens af te sluiten.

Het voorbeeld vereist dat listBox1 en button1 zijn gemaakt en op een formulier zijn geplaatst.

public:
   static void main()
   {
      // Starts the application.
      Application::Run( gcnew Form1 );
   }

private:
   void button1_Click( Object^ sender, System::EventArgs^ e )
   {
      // Populates a list box with three numbers.
      int i = 3;
      for ( int j = 1; j <= i; j++ )
      {
         listBox1->Items->Add( j );
      }
      
      /* Determines whether the user wants to exit the application.
       * If not, adds another number to the list box. */
      while ( MessageBox::Show( "Exit application?", "",
         MessageBoxButtons::YesNo ) == ::DialogResult::No )
      {
         // Increments the counter ands add the number to the list box.
         i++;
         listBox1->Items->Add( i );
      }
      
      // The user wants to exit the application. Close everything down.
      Application::Exit();
   }
public static void Main(string[] args) {
    // Starts the application.
    Application.Run(new Form1());
 }

 private void button1_Click(object sender, System.EventArgs e) {
    // Populates a list box with three numbers.
    int i = 3;
    for(int j=1; j<=i; j++) {
       listBox1.Items.Add(j);
    }

    /* Determines whether the user wants to exit the application.
     * If not, adds another number to the list box. */
    while (MessageBox.Show("Exit application?", "", MessageBoxButtons.YesNo) ==
       DialogResult.No) {
       // Increments the counter ands add the number to the list box.
       i++;
       listBox1.Items.Add(i);
    }

    // The user wants to exit the application. Close everything down.
    Application.Exit();
 }
<STAThread()> _
Shared Sub Main() 	
   ' Starts the application.
   Application.Run(New Form1())
End Sub

Private Sub button1_Click(sender As object, e As System.EventArgs)
   ' Populates a list box with three numbers.
   Dim i As Integer = 3
   Dim j As Integer
   For j = 1 To i - 1
      listBox1.Items.Add(j)
   Next

   ' Checks to see whether the user wants to exit the application.
   ' If not, adds another number to the list box.
   While (MessageBox.Show("Exit application?", "", MessageBoxButtons.YesNo) = _ 
      DialogResult.No)
      ' Increments the counter and adds the number to the list box.
      i = i + 1
      listBox1.Items.Add(i)
   End While

   ' The user wants to exit the application. Close everything down.
   Application.Exit()
End Sub

Opmerkingen

Normaal gesproken roept de hoofdfunctie van een toepassing deze methode aan en wordt deze doorgegeven aan het hoofdvenster van de toepassing.

Met deze methode wordt een gebeurtenis-handler toegevoegd aan de mainForm parameter voor de Closed gebeurtenis. De gebeurtenis-handler roept ExitThread aan om de toepassing op te schonen.

Note

De Dispose methode van de Form klasse wordt aangeroepen voordat deze methode wordt geretourneerd.

Zie ook

Van toepassing op