我的应用程序因此错误而崩溃:试图读取或写入受保护的内存
本文关键字:读取 受保护 内存 应用程序 错误 崩溃 我的 | 更新日期: 2023-09-27 18:16:42
我开发了一个winform应用程序(使用vs 2010 c#)。在这个应用程序中,我使用了一个com对象,这个对象有一些事件。其中之一是:
void a_Received(object sender, ReceivedEvent e)
{
richTextBox1.Text = e.Message;
}
触发此事件的另一部分代码是这样的:
private void btnSendMessage_Click(object sender, EventArgs e)
{
MyComObject obj = new MyComObject();
obj.SendCommand(txtCommand.Text);
}
所以有时候基于命令,事件同时接收到2个或更多的消息,我得到了这个异常:试图读写受保护的内存。这通常表明其他内存已损坏
如果只有一条消息(通过事件),一切都很好。
那么问题是什么呢?我能做什么?
编辑:当接收到的所有消息在代码末尾(我的意思是在事件的}之后)处理(并且成功处理)时,将发生异常。
StackTrace:
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageA(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at IranAir.Program.Main() in C:'Users'Administrator'Desktop'Gabriel'Program.cs:line 18 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
不能让两个线程同时写同一个文件。这就是为什么当你试图删除一个正在使用的文件时,Windows会弹出"这个文件正在使用中"的提示。当一个文件正在使用时,windows 保护文件不被另一个进程阻塞。您需要确保一次只写入一条消息。设置队列或检查文件是否正在使用。请看这篇文章:
是否有一种方法来检查文件是否正在使用?