dangerousThreadingAPI MDA

Asystent dangerousThreadingAPI zarządzanego debugowania (MDA) jest aktywowany, gdy Thread.Suspend metoda jest wywoływana w wątku innym niż bieżący wątek.

Objawy

Aplikacja nie odpowiada. Dane systemu lub aplikacji mogą być tymczasowo pozostawione w nieprzewidywalnym stanie, a nawet po zamknięciu aplikacji. Niektóre operacje nie są wykonywane zgodnie z oczekiwaniami.

Objawy mogą się znacznie różnić ze względu na losowość związaną z problemem.

Przyczyna

Wątek jest asynchronicznie zawieszony przez inny wątek przy użyciu Suspend metody . Nie ma możliwości określenia, kiedy można bezpiecznie zawiesić inny wątek, który może znajdować się w środku operacji. Wstrzymanie wątku może spowodować uszkodzenie danych lub przerwanie wariancji. Jeśli wątek zostanie umieszczony w stanie wstrzymania i nigdy nie zostanie wznowiony przy użyciu Resume metody, aplikacja może przestać odpowiadać i potencjalnie uszkodzić dane aplikacji. Te metody zostały oznaczone jako przestarzałe.

Jeśli element pierwotny synchronizacji jest przechowywany przez wątek docelowy, pozostają one przechowywane podczas zawieszenia. Może to prowadzić do zakleszczenia w przypadku innego wątku, na przykład wątku Suspendwykonującego operację , próby uzyskania blokady na elementach pierwotnych. W takiej sytuacji problem pojawia się jako impas.

Rozwiązanie

Unikaj projektów, które wymagają użycia elementów Suspend i Resume. W przypadku współpracy między wątkami użyj elementów pierwotnych synchronizacji, takich jak Lock, Monitor, ReaderWriterLock, Mutexlub instrukcji języka C# lock . Jeśli musisz użyć tych metod, zmniejsz przedział czasu i zminimalizuj ilość kodu wykonywanego, gdy wątek jest w stanie wstrzymania.

Wpływ na środowisko uruchomieniowe

Ta usługa MDA nie ma wpływu na CLR. Raportuje tylko dane dotyczące niebezpiecznych operacji wątkowych.

Wyjście

MdA identyfikuje niebezpieczną metodę wątkowania, która spowodowała jego aktywowanie.

Konfigurowanie

<mdaConfig>  
  <assistants>  
    <dangerousThreadingAPI />  
  </assistants>  
</mdaConfig>  

Przykład

Poniższy przykład kodu przedstawia wywołanie Suspend metody, która powoduje aktywację dangerousThreadingAPIelementu .

using System.Threading;  
void FireMda()  
{  
Thread t = new Thread(delegate() { Thread.Sleep(1000); });  
    t.Start();  
    // The following line activates the MDA.  
    t.Suspend();
    t.Resume();  
    t.Join();  
}  

Zobacz też