我使用以下代码来调用我的应用程序中的主UI线程上的控件.我在Status Strip中的进度条没有InvokeRequired,我需要以某种方式调用System.Windows.Forms.ToolStripProgressBar.
if (txtbox1.InvokeRequired)
{
txtbox1.Invoke(new MethodInvoker(delegate { txtbox1.Text = string.Empty; }));
}
Run Code Online (Sandbox Code Playgroud) 我必须从线程关闭Form,并且正在使用Form的Invoke方法调用Close()方法。
问题是,关闭时将处理该窗体,并且我收到一条InvalidOperationExecption消息:“在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke”。
仅当在Close方法中使用“ Step Into”进行调试时,我才遇到此异常,但是我不想冒险在正常运行时可能出现错误。
这是重现它的示例代码:
private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(CloseForm);
thread.Start();
}
private void CloseForm()
{
this.Invoke(new EventHandler(
delegate
{
Close(); // Entering with a "Step Into" here it crashes.
}
));
}
Run Code Online (Sandbox Code Playgroud)
表单以自动生成的表单代码(我不希望对其进行修改)处理:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以为我提供这种方法或其他方法来关闭另一个线程中的表单,我将不胜感激。
我试图在原则上做一些非常简单的事情,但是我不断得到一个令cross-threading exception我难过的东西因为我没有开始使用多个线程.
我有一个Windows窗体应用程序.它启动另一个Windows窗体应用程序(使用System.Diagnostics.Process该类),并在该应用程序关闭时捕获Exited事件.然后,我的应用程序事件处理程序尝试将文本从剪贴板复制到当前显示的表单上的控件.在这一点Cross-threading exception上抛出了一个.
我假设问题是关闭应用程序中的事件是在另一个线程中(我在我的舒适区之外,所以请耐心等待),所以问题归结为"如何防止此异常?"
我有点受限于必须从剪贴板复制,但如果可以解决问题,我可以以不同的方式启动其他应用程序.
我不确定这是否是一个好的编程礼仪,无论如何我有一个常规的方法,我更新某些数据和UI元素,如文本块等.
无论如何,我想创建一个线程,每X个Seconds运行更新方法,但我无法访问它,因为据我所知,线程只能运行静态方法.
围绕这个最好的方法是什么?
谢谢,
毫克.
我的同事喜欢这样做
if (!listbox1.InvokeRequired)
listbox1.Items.Add(Container.error_message);
else
listbox1.Invoke((MethodInvoker)delegate
{
listbox1.Items.Add(Container.error_message);
});
Run Code Online (Sandbox Code Playgroud)
他为什么要检查InvokedRequired?仅使用此声明会更好吗?
listbox1.Invoke((MethodInvoker)delegate
{
listbox1.Items.Add(Container.error_message);
});
Run Code Online (Sandbox Code Playgroud) 我有一个创建新线程的按钮.该线程包含以下内容.
foreach (DataRow r in results.Rows)
{
var item = new ResultItem(this)
{
Image = r[1].ToString(),
Video = r[2].ToString(),
Title = r[3].ToString().Trim(),
Duration = r[4].ToString().Trim()
};
SearchFlow.Controls.Add(item);
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:在一个线程上创建的控件不能作为另一个线程上的控件的父级.ResItem是自定义用户控件,它是项目的一部分,而不是第三方控件.有没有解决的办法?如何将此控件添加到新线程中的流表?
我正在为学校做一个tictactoe项目,我似乎无法解决我无法访问的代码问题.我查找了其他无法访问的代码问题,但我不确定如何解决它,因为我不是很擅长这个.我知道这是一个警告,但当我开始我的程序时,它不会填写空白当我按他们.
private void Movement(object sender, EventArgs e)
{
if (InvokeRequired)
{
this.Invoke(new Action<object, EventArgs>(Movement), new object[] { sender, e });
return;
UpdateData(sender); //This is where it points for unreachable
var lbl = (Label)sender;
lbl.Enabled = false;
lbl.Text = currentPlayer.ToString();
if (!CheckWin())
NextTurn();
}
}
private void UpdateData(object sender)
{
Label lbl = sender as Label;
if (lbl == lbl00)
GameData[0, 0] = currentPlayer;
else if (lbl == lbl10)
GameData[1, 0] = currentPlayer;
else if (lbl == lbl20)
GameData[2, 0] = …Run Code Online (Sandbox Code Playgroud)