jjzjj

c# - System.Drawing.dll 中出现类型为 'System.ApplicationException' 的未处理异常

coder 2024-05-20 原文

我有一个 winforms 应用程序。在开发模式下,当从 Visual Studio .NET 2003 进行调试时(是的,我知道它很旧,但这是一个遗留项目),当我尝试打开一个新窗体时出现此错误。为了打开一个新表单,我获取了该表单的一个实例,然后我调用了 ShowDialog() 方法,例如:

frmTest test = new frmTest(here my parameters);
test.ShowDialog();

如果我在调试时按 F11(进入)它不会崩溃,但如果在我实例化表单的行中我按 F10 进入下一行,即 test.ShowDialog(),那么它会崩溃显示这个错误。

完整的报错是:

"An unhandled exception of type 'System.ApplicationException' occurred in System.drawing.dll. Additional Information: An attempt was made to free a mutual exclusion that does not belong to the process"

我已经翻译了最后一部分:附加信息......因为它以西类牙语出现。

我用参数实例化的形式,它的构造函数,包括初始化一些变量,例如:

public frmTest(string param1, string param2)
{
   InitializeComponent();

   this.param1 = param1;
   this.param2 = param2;
}

private void frmTest_Load(object sender, EventArgs e)
{
    // here I call a remote webservice asynchronously.
}

我的表单“frmTest”还有四个图片框、一个标签和一个按钮。其中三个图片框包含一个 png 图像(它在设计时通过 Image 属性分配),最后一个图片框包含一个动画 gif,也在设计时通过 Image 属性加载。可能是这些图片导致的错误?

最佳答案

TL;DR: Your web request handler will execute on a different thread. Ensure you don't do anything that isn't thread-safe in that handler. You can use Invoke to dispatch your callback handler's code to the main thread.

诊断

这里的问题几乎肯定隐藏在您的异步调用的缺失细节中。

// here I call a remote webservice asynchronously.

Asynchronously 有点过于模糊,无法确定到底 发生了什么,但是很有可能您正在使用的异步机制已经执行了它的 < strong="">在主 UI 线程的不同线程上回调。

概览

这在 .NET 模型中很常见。 .NET 模型中的异步 I/O 使用线程池中的线程通过 I/O Completion Ports (IOCP) 处理 I/O .这意味着当 Socket.BeginReceiveWebRequest.BeginGetResponse 之类的调用(或任何内部使用类似技术的 .NET 异步 Web 请求)完成时,回调将在线程池中的一个线程上执行不是主线程。这可能会让您感到惊讶,因为您没有主动创建另一个线程;您刚刚参与了异步调用。

您必须非常小心在 Web 请求的回调中执行的操作,因为除了主 UI 线程外,任何线程都不允许执行许多用户界面/Windows 窗体操作。同样,导致问题的可能不是 UI 本身,您可能刚刚访问了一些非线程安全的资源或对象。如果您不小心处理多线程,许多看似无害的事情可能会导致崩溃或异常。

解决问题:

如果有疑问,请在您的回调中尽早分派(dispatch)(也称为 Invoke)您的处理程序中的代码,以便它在主线程上运行。

执行此操作的常见模式如下所示。

假设你打了这样一个电话:

IAsyncResult result = (IAsyncResult myHttpWebRequest.BeginGetResponse(
    new AsyncCallback(RespoCallback), myRequestState);

处理程序可以这样设置:

private static void RespCallback(IAsyncResult asynchronousResult)
{  
    // THIS IS NOT GOING TO WORK BECAUSE WE ARE ON THE WRONG THREAD.  e.g.:
    this.label1.Text = "OK";  // BOOM!  :(
}

相反,将任何必要的处理分派(dispatch)回主线程。

private static void RespCallback(IAsyncResult asynchronousResult)
{  
    this.Invoke((MethodInvoker) delegate { 
       // This block of code will run on the main thread.
       // It is safe to do UI things now.  e.g.:
       this.label1.Text = "OK";  // HOORAY!  :)
    });
}

建议将此作为一般最佳实践。我不是是说立即将所有处理程序分派(dispatch)回主线程。一种尺寸适合所有尺寸。您真的应该查看您在处理程序中执行的操作的具体细节,并确保您没有执行特定于线程的操作。但我说,如果您没有对您的异步处理程序正在做什么进行任何解释,问题可能会通过 invoking 解决。主线程上的处理程序代码。

注意:当然,要使用此技术解决您的问题,它需要您的主线程正在运行。如果您使用类似 this example 中的(错误)技术阻塞了主线程那么您将不得不重新设计应用程序的一部分。这是一个需要更大返工的示例:

// Start the asynchronous request.
IAsyncResult result=
  (IAsyncResult) myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback),myRequestState);

// this line implements the timeout, if there is a timeout, the callback fires and the request becomes aborted
ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);

// The response came in the allowed time. The work processing will happen in the 
// callback function.
allDone.WaitOne(); // *** DANGER:  This blocks the main thread, the IO thread
                   // won't be able to dispatch any work to it via `invoke`

注意到 WaitOne 调用了吗?这会阻止正在执行的线程的执行。如果此代码在主线程上执行,则主线程将被阻塞,直到 WebRequest 完成。您将不得不重新设计,这样您就不会阻塞主线程(我的建议),或者您更仔细地检查您的回调处理程序以了解为什么它正在做的事情与其他线程冲突。

关于c# - System.Drawing.dll 中出现类型为 'System.ApplicationException' 的未处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936177/

有关c# - System.Drawing.dll 中出现类型为 'System.ApplicationException' 的未处理异常的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  9. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  10. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

随机推荐