我在Windows窗体上有下一个代码
if (control.IsHandleCreated)
{
if (control.InvokeRequired)
{
control.BeginInvoke(action);
}
else
{
action.Invoke();
}
}通过调试,它进入了InvokeRequired = false,并且工作得很好,但是在生产环境中。它以某种方式进入InvokeRequired = true,因此它应该执行BeginInvoke()方法。
它没有。它从来没有进入行动。这个脚本属于DataGrid控件,但是在不同的DataGrids、Comboboxes等相同的表单上具有相同的功能;因此,对于这个DataGrid来说,它似乎是一种额外的东西。有什么想法吗?
谢谢
发布于 2019-04-14 05:41:59
我试图找到真正的答案,我的猜测是,当您调用thread调用时,消息会被放在队列中等待该线程。该线程从这个队列中取出项目,并将它们一一对应地处理。您的队列将变得越来越大,并需要越来越多的时间来处理。然后,主线程可能会被阻塞,做其他事情。当您的线程正在执行这些其他事情时,它将不会处理队列中的项,那么线程就无法访问该控件。我测试了您的代码,在缺少访问权限的情况下,代码不能重复,然后我更改了代码,并在重复一两次之后工作:
int i = 0;
public delegate void AsyncMethodCaller();
private void proc2()
{
Action action = () => control1.Text = (i += 1).ToString();
if (control1.IsHandleCreated)
{
if (control1.InvokeRequired)
{
control1.BeginInvoke(new AsyncMethodCaller(proc2));
}
else
{
action.Invoke();
}
}
else
{
MessageBox.Show("Handle creation error");
}
}
private void proc1()
{
for (int i=0; i<1000; i++)
{
//do something
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(proc1);
thread1.Start();
Thread thread2 = new Thread(proc2);
thread2.Start();
}发布于 2019-04-11 06:10:09
这就是我刚才说的:
<your control>.Invoke(new MethodInvoker(delegate () {
… do your work here
}));-Gina
https://stackoverflow.com/questions/41617725
复制相似问题