关闭Application时抛出异常

时间:2017-08-19 17:51:24

标签: c# multithreading winforms exception

我已经构建了一个使用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()被调用后,我仍然得到异常。

有什么方法可以解决这个问题吗?如何检查应用程序是否已关闭?

1 个答案:

答案 0 :(得分:2)

当线程仍在运行时窗体关闭时,有可能在窗体关闭后和线程中止之前调用其中一个调用。 该调用尝试在表单的UI线程(不再运行)的上下文中执行委托。

解决方案:您需要使用一种可以阻止线程运行的机制(在表单的OnClosing事件中)。

我建议使用Task(请参阅https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming),您可以使用CancellationToken取消。

注意:在Task中,您需要在调用CancellationToken方法之前检查Invoke,以确保只有在没有请求取消时才会调用它们。