luglio 2005 Blog Posts
Succede solo a me che quando scrivo#Region
""#End Region"
Mi impazzisce Visual
Studio e scrive in giapponese?!
INCREDIBILE!!!
Scusate l'OT, ma questo é veramente troppo!Da settembre mio padre ha sottoscritto un contratto con Fastweb. Io avevo attivo, sulla linea di mio padre, un contratto ADSL con TIN.IT. Ovviamente non ci possono essere 2 contratti ADSL sulla stessa linea quindi il servizio di Tin.it mi é stato prontamente sospeso. Nonostante ciò Tin.it ha pensato di continuare ad addebitarmi le fatture sulla carta di credito e non solo, ma anche di RINNOVARMI TACITAMENTE L'ABBONAMENTO (del servizio che NON mi viene erogato) per un altro anno. Vi sembra normale? Ma la parte migliore deve ancora arrivare: mi é appena arrivata una lettera in...
Alla ricerca di una soluzione per il QuizSharp di Adrian mi sono imbattutto
in una bella stranezza del Threading: a quanto posso vedere il Thread principale
di un'applicazione NON termina finché non terminano tutti i Thread "secondari"
con piorità almeno Normal.
La prova:
class Foo { static System.Threading.Thread MainThread; static void SecThread() { if (MainThread.IsAlive) MainThread.Join(); Console.WriteLine("Fine Thread Secondario"); } static void Main() { MainThread = System.Threading.Thread.CurrentThread; System.Threading.Thread ST = new System.Threading.Thread(new System.Threading.ThreadStart(SecThread)); ST.Priority = System.Threading.ThreadPriority.AboveNormal; ST.Start(); Console.WriteLine("Fine Thread Principale"); } }
Questo codice NON termina MAI, perché la Procedura SecThread che gira nel
Thread "secondario" aspetta che il Thread principale dell'applicazione termini,
ma questo NON termina!!! L'applicazione raggiunge l'ultima riga di Main, stampa
a console "Fine Thread Principale", ma in realtà il Thread principale sopravvive
alla fine del Main ed entra nello stato composito di: "Background, Stopped,
WaitSleepJoin", tant'é vero che...
Oggi mi sono trovato per
la prima volta a creare delle classi on-the-fly ereditando da una classe base ed
estendendo in base a delle informazioni passate.
Benché ci siano già
parecchi esempi in rete (che comunque ho fatto parecchia fatica a trovare) posto
anche il mio esempio che é arricchito di una piccola funzione per aggiungere i
riferimenti in maniera semplice.
Dim provider As Microsoft.VisualBasic.VBCodeProvider Dim compiler As System.CodeDom.Compiler.ICodeCompiler Dim results As System.CodeDom.Compiler.CompilerResults 'Impostazioni di compilazione Dim cp As New System.CodeDom.Compiler.CompilerParameters cp.GenerateInMemory = True 'Non mi interessa salvare su disco cp.TreatWarningsAsErrors = False cp.ReferencedAssemblies.Add("System.dll") AddReferences(cp, GetType(TipoUtilizzatoDalCodiceGenerato)) Try provider = New Microsoft.VisualBasic.VBCodeProvider compiler = provider.CreateCompiler results = compiler.CompileAssemblyFromSource(cp, CodiceGenerato) If results.Errors.Count = 0 Then Dim Ass As System.Reflection.Assembly = results.CompiledAssembly Dim GeneratedType as Type = Ass.GetType("GeneratedType") 'Creo un'istanza del tipo appena creato Dim O As Object = Activator.CreateInstance(Me.GeneratedType) 'Inserire qui il codice che usa il nuovo oggetto! Else 'Errore di compilazione! End If Catch ex As System.Exception 'Attenzione: qualcosa é andato storto: il compilatore non dovrebbe 'sollevare eccezioni normalmente, ma al massimo riportare errori di 'compilazione in: results.Errors End Try
Private Sub AddReferences(ByVal cp As System.CodeDom.Compiler.CompilerParameters, ByVal type As System.Type) For Each M As System.Reflection.Module In type.Assembly.GetModules() cp.ReferencedAssemblies.Add(M.Name) Next M 'Analisi tipo base If Not type.BaseType Is GetType(System.Object) Then AddReferences(cp, type.BaseType) End If 'Analisi interfacce For Each T As Type In type.GetInterfaces AddReferences(cp, T) Next T End Sub