首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对CallContext在OnShown处理程序中的更改不会持久

对CallContext在OnShown处理程序中的更改不会持久
EN

Stack Overflow用户
提问于 2016-03-24 06:04:51
回答 1查看 74关注 0票数 0

System.Windows.Forms.Form中,在OnShown覆盖(或Shown事件处理程序)中对OnShown进行的任何修改都会在事件发生后消失。例如,在下面的代码中,当双击表单时,它将显示“启动!”在标题中,数据实际上被修改为“你好,世界!”当表格显示出来的时候。

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

代码语言:javascript
复制
...
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);
    }
}

有人能解释一下这种行为的原因吗?(或者仅仅是我的电脑,做自己的事情?)

.Net Framework4.6.1 (Visual 2015)在Windows7 x64中进行了尝试;目标平台是x86 (x64或AnyCPU没有运气);[STAThread]应用于Main()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-29 18:22:35

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

如果您查看Form的源代码,您将看到在CallShownEvent方法中调用OnShown,该方法在OnLoad方法中使用BeginInvoke调用,因此CallContext中的更改是OnShown方法的本地更改,在当前上下文中不可见。

代码语言:javascript
复制
public class Form : ContainerControl 
{
    ...
    protected virtual void OnLoad(EventArgs e) 
    {
        ...
        this.BeginInvoke(new MethodInvoker(CallShownEvent));
        ...
    }
    private void CallShownEvent()
    {
        OnShown(EventArgs.Empty);
    }
    ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36194160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档