- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 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.BeginReceive
或 WebRequest.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/
我一直在调试我新创建的 WCF 服务故障合约的问题,并最终找到了问题所在。 我这样定义服务: [ServiceContract] public interface IService1 { [O
我正在尝试朗姆酒我的应用程序,但我收到以下错误:System.Web.HttpUnhandledException:引发了“System.Web.HttpUnhandledException”类型的异
Printscreen我的代码错误和我的引用资料。“ApplicationException”有错误,我只是不知道如何解决它。 using System; using System.Net; usin
我只是在 Mutex 上进行试验并编写了以下代码。 using System; using System.Collections.Generic; using System.Linq; using S
在我的文件存储库中,当调用 InsertFile() 方法时,我将抛出以下异常: 超过上传文件大小限制时 超出存储容量时 目前我只是抛出一个带有相关消息的ApplicationException: p
我正在尝试一个 ApplicationException 异常,当输入不是数字时,它只会显示一条消息。这是我现在拥有的: static void getBookInfo(Book book) {
我的问题与事务和异常有关 要求: 我有 10 条记录要插入到数据库表中。在插入每条记录后,我将数据插入到另一个表中。因此,如果插入第二个表失败,我想回滚该记录。 例。假设一次处理 10 个人的现金转账
为了抛出异常,我通常使用内置的异常类,例如ArgumentNullException 和 NotSupportedException。但是,有时我需要使用自定义异常,在这种情况下我会写: class
我正在 VSCode 中使用 C# 开发语音转文本模型。该模型正确转录第一个文件。当我添加新文件并尝试转录时,出现以下错误: 发生异常:CLR/System.ApplicationExceptionS
我正在尝试对这样的 wav 文件进行语音识别: var config = SpeechConfig.FromSubscription("mykey", "myregion"); using (var
我正在尝试对这样的 wav 文件进行语音识别: var config = SpeechConfig.FromSubscription("mykey", "myregion"); using (var
我们面临类似于以下的场景: @ApplicationException(rollback = true) class UniqueConstraintViolated extends RuntimeE
我的运行时异常 @ApplicationException(rollback=false) public class UncheckedException extends RuntimeExcepti
据我所知,您应该始终在 .NET 中为您的自定义异常实现 ApplicationException 类。我最近开始开发 Windows Phone 7,但我找不到这个类。我现在应该使用不同的类(cla
我通过 CodenameOne 的 IKVM 版本运行了一个第 3 方 Android 库,并成功导入了输出 .dll 作为对我在 Visual Studio 中的 UWP 应用程序的引用。在尝试编译
我有 Web 服务,其方法会抛出我的自定义异常。 @WebMethod void someMethod(...) throws MyException MyException 类用 @Applic
我在 JSF bean 中这样调用 account EJB 方法: try{ account.someFunction(...); }catch(SimRuntimeException e){
我在 c++/CLI 库中有以下代码来捕获非托管异常并重新抛出它们: catch(const std::exception &e) { String ^errorMessage = Strin
我有一个方法可以抛出应用程序异常,并且回滚为 true。我想知道是否必须显式调用 ejbContext.setRollbackOnly() ? 文档 here表示当异常标记为rollback=true
我需要一些指导,了解如何在 Java EE 环境中最好地使用异常,通过 JAX-RS 为客户端提供服务。 目前,我有很多异常,都扩展了 RuntimeException,并用 @Application
我是一名优秀的程序员,十分优秀!