2016-04-29 11 views
5

Przechodziłem przez debugger w jakimś kodzie bazy danych strony i zakończyłem wykonywanie przed zmianami bazy danych. Ale wciąż były zapisane w bazie danych!Blokowanie USINGa zachowuje się inaczej na stronie internetowej niż na windowsie z formularza

Próbowałem odtworzyć problem za pomocą aplikacji Windows Form i nie zapisałem danych w bazie danych (oczekiwane zachowanie). Wróciłem do strony internetowej i to zrobił.

Oto prosta przykładowa strona. Używam tego w internetowej miejscu czy to robi różnicę:

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Diagnostics" %> 

<!DOCTYPE html> 

<script runat="server"> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     using (MsSqlDataContextDataContext db = new MsSqlDataContextDataContext()) 
     { 
      Product product = db.Products.First(p => p.id == 21); 
      Debug.WriteLine("Line 1"); 
      // I learnt the hard way that if you try to update the database with the value 
      // that already exists, it seems to get optimised away. 
      // The update must a new value. 
      product.Type = "bogus" + DateTime.UtcNow.Ticks; 
      Debug.WriteLine("Line 2"); // <- Breakpoint here 
      db.SubmitChanges(); 
     } 
    } 
</script> 

<html> 
<head runat="server"> 
</head> 
</html> 

kończę wykonanie (Przesunięcie + F5) przy zerwaniu, przed drugi druku debug lub SubmitChanges() zostanie wykonany . "Linia 2" to nie wyjście do okna debugowania, ale zmieniono bazę danych na.

Uruchamianie tego samego testu w formularzu systemu Windows zachowuje się tak samo.

Czy cykl życia strony lub zarządzanie sesją w jakiś sposób tu przeszkadza? Jak to jest możliwe, Linia 2 nie zostanie wydrukowana!

+0

Czy otrzymujesz błąd/wyjątek na formularzu okna, jak to działa? – raidensan

+0

@raidensan Przebiorę to. Nie zachowuje się tak samo. Nie zapisuje zmiany w bazie danych (jak się spodziewałem, nie powinna, biorąc pod uwagę, że przerwano przed wywołaniem "Prześlij"). – Ian

+0

Wykonaj polecenie "throw new Exception()" zamiast "Debug.WriteLine (" Line 2 ")" w swoim przykładzie i zobacz, jak to działa. – Evk

Odpowiedz

6

Po zatrzymaniu debugowania w aplikacji Winform proces kończy się, a kod przestaje działać.

W asp.net tak nie jest. Kiedy zatrzymasz debuggera (zwykle), to nie zakończymy procesu iis, wystarczy odłączyć debugger. Twój kod nadal działa, a prośba jest kompletna.

Istnieją duplikaty tego pytania, nie ma powtórzeń, aby oznaczyć to jako duplikat.

+0

Dobre wyjaśnienie, szukałem, ale nie znając przyczyny, to utrudniało. Zobaczę, czy uda mi się znaleźć dupę i sam ją oznaczyć :) Albo połącz mnie z dupkiem, a ja to zgłoszę. – Ian

+0

Nie jest to dokładny duplikat: [link] (http://stackoverflow.com/questions/1338785/the-asp-net-code-start- exececuts-clicking-stopping-debugging-in-vs2008) (Wyjaśnia, że ​​potrzebujesz zakończyć proces) – apr

Powiązane problemy