OnShown处理程序中对CallContext的更改不会保留

时间:2016-03-24 06:04:51

标签: c# .net winforms

System.Windows.Forms.Form中,对CallContext覆盖(或OnShown事件处理程序)中Shown所做的任何修改都会在事件发生后消失。例如,在以下代码中,双击表单时,它将显示“正在启动!”在它的标题中,数据实际上被修改为'Hello,World!'当表格显示时。

如果覆盖应用于OnLoad而不是OnShown,则双击将按预期显示消息('Hello,World!')。

...
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);
    }
}

有人可以解释这种行为的原因吗? (或者它只是我的电脑,做自己的事情?)

这是在Windows 7 x64中的.Net Framework 4.6.1(Visual Studio 2015)中尝试过的。目标平台是x86(x64或AnyCPU没有运气); [STAThread]已应用于Main()

1 个答案:

答案 0 :(得分:1)

行为正常。当您使用Form.BeginInvoke调用方法时,它会使用捕获的ExecutionContext来运行该方法,之后在CallContext中所做的更改将不可见。

如果您查看Form的源代码,您会看到OnShown方法中调用了BeginInvokeCallShownEvent方法使用OnLoad中的CallContext方法,因此OnShown中的更改是public class Form : ContainerControl { ... protected virtual void OnLoad(EventArgs e) { ... this.BeginInvoke(new MethodInvoker(CallShownEvent)); ... } private void CallShownEvent() { OnShown(EventArgs.Empty); } ... } 方法的本地更改,并且在当前上下文中不可见。

$stmt = $this->db->prepare("UPDATE images SET
   dir_images = :dir_images
   WHERE id_images = :id_images");

foreach ($idsimages as $key => $idsimage) { 
    $stmt->bindParam(":id_images", $idsimage);
    $stmt->bindParam(":dir_images", $dir_images[$key]);             

    $stmt->execute();
} // end foreach idsimages