2016-03-24 9 views
0

In einem System.Windows.Forms.Form Persisted alle die CallContext getan Änderungen in der OnShown Korrektur (oder die Shown Event-Handler), verschwinden nach der Veranstaltung. Wenn Sie beispielsweise im folgenden Code auf das Formular doppelklicken, wird "Starten" angezeigt. in seinem Titel, während die Daten tatsächlich zu "Hallo, Welt!" wenn das Formular angezeigt wurde.Änderungen an Callcontext in OnShown Handler sind nicht

Wenn die Überschreibung auf statt OnShown angewendet wird, zeigt ein Doppelklick die Meldung wie erwartet an ('Hallo, Welt!').

... 
using System.Runtime.Remoting.Messaging; 
... 

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 

     CallContext.SetData("Message", "Starting Up!"); 
    } 

    public string Message 
    { 
     get 
     { 
      return CallContext.GetData("Message") as string; 
     } 
    } 

    protected override void OnShown(EventArgs e) 
    { 
     CallContext.SetData("Message", "Hello, World!"); 

     base.OnShown(e); 
    } 
    protected override void OnDoubleClick(EventArgs e) 
    { 
     this.Text = this.Message; 

     base.OnDoubleClick(e); 
    } 
} 

Kann jemand den Grund für dieses Verhalten erklären? (Oder ist es nur mein PC, seine eigenen Dinge zu tun?)


Dies wurde versucht, in .Net Framework 4.6.1 (Visual Studio 2015) in Windows 7 x64; Zielplattform ist x86 (kein Glück mit x64 oder AnyCPU); [STAThread] wird auf Main() angewendet.

+1

Das Verhalten ist normal. Wenn Sie eine Methode aufrufen, die 'Form.BeginInvoke' verwendet, verwendet sie einen erfassten' ExecutionContext', um die Methode auszuführen, und Änderungen, die Sie in 'CallContext' vornehmen, sind danach nicht mehr sichtbar. Wenn Sie sich Quellcode für 'Form' ansehen, werden Sie sehen, dass' OnShown' in 'CallShownEvent' Methode aufgerufen wird, die mit' BeginInvoke' in ['OnLoad'] aufgerufen wird (http://referencesource.microsoft.com). com/# System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs, 4906) Methode und so Änderungen in 'CallContext' sind lokal zu' OnShown' Methode und sind nicht im aktuellen Kontext sichtbar. –

+0

@ reza-aghaei Bekam es; Danke ... Das ist die Antwort ... Ich habe das 'BeginInvoke' für CallShownEvent am Ende von' OnLoad' vermisst ... – Raje

Antwort

1

Das Verhalten ist normal. Wenn Sie eine Methode aufrufen, die Form.BeginInvoke verwendet, verwendet es eine erfasste ExecutionContext, um die Methode auszuführen, und Änderungen, die Sie in CallContext vornehmen, sind danach nicht sichtbar.

Wenn Sie einen Blick auf Quellcode nehmen für Form, sehen Sie OnShown in CallShownEvent Methode aufgerufen wird, die BeginInvoke in OnLoad Methode aufgerufen wird und so Änderungen in CallContext sind lokal für OnShown Verfahren und sind nicht sichtbar im aktuellen Kontext.

public class Form : ContainerControl 
{ 
    ... 
    protected virtual void OnLoad(EventArgs e) 
    { 
     ... 
     this.BeginInvoke(new MethodInvoker(CallShownEvent)); 
     ... 
    } 
    private void CallShownEvent() 
    { 
     OnShown(EventArgs.Empty); 
    } 
    ... 
} 
Verwandte Themen