Artikel-ID: 328811 - Geändert am: Samstag, 30. Dezember 2006 - Version: 1.4

Update: Die Leistung einer statischen synchronisierte Methode in .NET Framework 1.0 langsam ist

Auf dieser Seite

Alles erweitern | Alles schließen

Problembeschreibung

Wenn mehrere Threads versuchen, eine statische synchronisierte Methode zur selben Zeit in Microsoft Visual Studio .NET 2002 zuzugreifen, wird die Leistung der synchronisierte Methode verlangsamt.

Hinweis: Eine statische synchronisierte Methode ist eine Methode, die das MethodImpl(MehtodImplOptions.Synchronized) -Attribut verwendet.

Lösung

Installieren Sie das neueste Servicepack für Microsoft .NET Framework 1.0, um dieses Problem zu beheben.
Um das neueste Servicepack zu erhalten, die folgende Microsoft-Website:
http://www.microsoft.com/downloads/details.aspx?familyid=6978D761-4A92-4106-A9BC-83E78D4ABC5B&displaylang=en (http://www.microsoft.com/downloads/details.aspx?familyid=6978D761-4A92-4106-A9BC-83E78D4ABC5B&displaylang=en)

Status

Microsoft hat bestätigt, dass dies ein Problem in Microsoft-Produkten handelt, die im Abschnitt "Gilt für" aufgeführt sind. Dieses Problem wurde erstmals in Microsoft .NET Framework 1.0 Service Pack 3.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Starten Sie Microsoft Visual Studio .NET.
  2. Zeigen im Menü Datei auf neu , und klicken Sie dann auf Projekt . Das Dialogfeld Neues Projekt angezeigt wird.
  3. Klicken Sie unter Projekttypen auf Visual Basic-Projekte , oder auf Visual C#-Projekte .
  4. Klicken Sie unter Vorlagen auf Console Application .
  5. Geben Sie in das Feld Name die Anwendung und klicken Sie dann auf OK . Standardmäßig ist eine der folgenden Dateien erstellt:
    • Wenn Sie Microsoft Visual Basic .NET verwenden, wird eine Datei mit dem Namen Module1.vb erstellt.
    • Wenn Sie Microsoft Visual c# .NET verwenden, wird eine Datei mit dem Namen Class1.cs erstellt.
  6. Ersetzen Sie in der Datei, die in Schritt 5 erstellt wurde den vorhandenen Code durch folgenden Code.

    Visual Basic .NET code
    Imports System
    Imports System.Threading
    Imports System.Runtime.CompilerServices
    
    Namespace StaticSynchronizer
       Class Test
            Shared StopThread As Thread
            Shared Sub Main()
                'Create two threads.
                Dim threads(1) As Thread
                Dim i As Integer
                Dim tstart As New ThreadStart(AddressOf (New Test()).run)
                For i = 0 To threads.Length - 1
                    threads(i) = New Thread(tstart)
                    threads(i).Name = "Thread " + i.ToString
                    'Start the threads.
                    threads(i).Start()
                Next
                Thread.Sleep(5000)
                If (threads.Length > 1) Then
                    StopThread = threads(0)
                End If
                Thread.Sleep(Timeout.Infinite)
            End Sub
            Public Sub run()
                Try
                    While (True)
                        Dim start As Integer = Environment.TickCount
                        Dim i As Integer
                        For i = 0 To 5000
                            SynchronizedMethod()
                        Next
                        Dim endno As Long = Environment.TickCount
                        Console.Out.WriteLine(Thread.CurrentThread.Name + ": " + _
                        (endno - start).ToString + " ms")
                        If (Thread.CurrentThread.Equals(StopThread)) Then
                            Exit While
                        End If
                    End While
                Finally
                    Console.Out.WriteLine(Thread.CurrentThread.Name + " exiting.")
                End Try
            End Sub
            'This is the synchronized method.
            <MethodImpl(MethodImplOptions.Synchronized)> _
            Private Shared Sub SynchronizedMethod()
    
            End Sub
        End Class
    End Namespace
    visual c# .NET Code
    using System;
    using System.Threading;
    using System.Runtime.CompilerServices;
    
    namespace StaticSynchronizer
    {
       class Test
       {
           static Thread StopThread = null;
    
           static void Main(string[] args)
           {
              //Create two threads.
              Thread[] threads = new Thread[2];		
              for (int i = 0; i < threads.Length; i++) 
              {
                   threads[i] = new Thread(new ThreadStart(new Test().run));
                   threads[i].Name = "Thread "+i;
                   //Start the threads.
                   threads[i].Start();
              }
              Thread.Sleep(5000);
              if (threads.Length > 1) 
              {
                  StopThread = threads[0];
              }
    
              Thread.Sleep(Timeout.Infinite);
           }
    
           public void run()
           {
               try 
               {
                    while (true) 
                    {
                         int start = Environment.TickCount;
                         for (int i = 0; i < 5000; i++) 
                            SynchronizedMethod(); 
                         long end = Environment.TickCount;
                         Console.Out.WriteLine(Thread.CurrentThread.Name+": "+(end-start)+" ms");
                         if (Thread.CurrentThread.Equals(StopThread))
                              break;			
                    }
               } 
               finally 
               {
                    Console.Out.WriteLine(Thread.CurrentThread.Name+" exiting.");
               }
           }
    
          //This is the synchronized method.
          [MethodImpl(MethodImplOptions.Synchronized)]
          private static void SynchronizedMethod()
          {
    			
          }
    
       }
    }
  7. Wenden Sie eine der folgenden Prozeduren an:
    • Gehen Sie bei Verwendung von Visual Basic .NET folgendermaßen vor das Startobjekt festlegen
      1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf die Anwendung und klicken Sie dann auf Eigenschaften . Das Dialogfeld Eigenschaftenseiten der Anwendung angezeigt wird.
      2. Klicken Sie im Startobjekt Wählen Sie Sub Main , und klicken Sie dann auf OK .
    • Wenn Sie Visual c# .NET verwenden, gehen Sie zu Schritt 8.
  8. Klicken Sie im Menü Erstellen auf Erstellen Projektmappen .
  9. Klicken Sie im Menü Debuggen auf Starten .
Die Ausgabe Beachten Sie, dass der Aufruf der synchronisierte Methode mehrere Sekunden abgeschlossen werden, dauert.

Weitere Informationen finden Sie im folgenden um Artikel in der Microsoft Knowledge Base anzuzeigen: Artikel
824684  (http://support.microsoft.com/kb/824684/ ) Erläuterung von Standardbegriffen bei Microsoft Softwareupdates

Informationsquellen

Weitere Informationen über MethodImplOptions -Enumeration finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:
http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx (http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx)

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 1.0
Keywords: 
kbmt kbhotfixserver kbqfe kbthread kbperformance kbqfe kbnetframe100presp3fix kbbug kbfix KB328811 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 328811  (http://support.microsoft.com/kb/328811/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
 

SPRACHE AUSWÄHLEN

 

Related Support Centers