我已经构建了一个使用function handleMouseMove(e){
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);
for(var i=0;i<entities.length;i++){
var entity=entities[i];
ctx.rect(entity.x, entity.y, width, height);
if(ctx.isPointInPath(mouseX,mouseY)){
ctx.font = "10px Arial";
ctx.fillStyle = "black";
ctx.textAlign = "left";
ctx.fillText("edit", entity.x + 5 , entity.y + 5 );
}
}
}
启动表单的应用程序。在应用程序中有以下线程函数
Application.Run(new Form)
当我关闭应用程序时,我得到了这个例外:
抛出异常:&#39; System.InvalidOperationException&#39;在 System.Windows.Forms.dll中
在System.Windows.Forms.Control.Invoke(Delegate方法,Object [] args)
我已经尝试通过在表单关闭时调用private void threadTask() {
while (true) {
Thread.Sleep(500);
if (isOn) {
Invoke((MethodInvoker) delegate { reloadData(tabControl.SelectedIndex); });
Invoke((MethodInvoker) delegate { onOffButton.BackColor = Color.Lime; });
Invoke((MethodInvoker) delegate { infoLabel.Visible = false; });
}
}
}
来解决此问题。该函数被执行,但是,Application.Exit()
被调用后,我仍然得到异常。
有什么方法可以解决这个问题吗?如何检查应用程序是否已关闭?
答案 0 :(得分:2)
当线程仍在运行时窗体关闭时,有可能在窗体关闭后和线程中止之前调用其中一个调用。 该调用尝试在表单的UI线程(不再运行)的上下文中执行委托。
解决方案:您需要使用一种可以阻止线程运行的机制(在表单的OnClosing事件中)。
我建议使用Task
(请参阅https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming),您可以使用CancellationToken
取消。
注意:在Task
中,您需要在调用CancellationToken
方法之前检查Invoke
,以确保只有在没有请求取消时才会调用它们。