在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()
。
答案 0 :(得分:1)
行为正常。当您使用Form.BeginInvoke
调用方法时,它会使用捕获的ExecutionContext
来运行该方法,之后在CallContext
中所做的更改将不可见。
如果您查看Form
的源代码,您会看到OnShown
方法中调用了BeginInvoke
,CallShownEvent
方法使用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