求一个异步处理消息的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个异步处理消息的方法相关的知识,希望对你有一定的参考价值。
将窗口收到的消息在新的线程中按消息的先后顺序处理,而不阻塞窗口的线程。要求新线程处理完前一个消息后要自动感知下一个消息并自动处理。
希望提供主要的框架的代码。
Re:lcg1986
经试验这个办法在每次处理了前几个消息后发生“System.ExecutionEngineException”类型的异常。异常发生在辅助线程的消息处理方法里的
MyStruct myStruct = (MyStruct)Marshal.PtrToStructure(m.LParam, typeof(MyStruct));
即根据消息的LParam指针读取数据缓冲区的数据。
缓冲区的数据是主窗口通过商业数据接收软件接收到,接收方式是该软件给启动它的窗口发消息,并向缓冲区发数据。
使用这个办法在前头几个消息的正常处理中如果关闭接收软件也会立即引发这个异常。
如果不用辅助线程则不出现这个异常。
不知是否和线程间传递消息有关,或者是缓冲区损坏的问题,或者异步读取缓冲区有什么讲究。
网上还有人说因为.net有垃圾回收装置也就是说他的地址内容可能是不定的,Marshal.PtrToStructure把它写入托管内存。它的指针域,可能是错误的。
using System;
using System.Collections.Generic;
using System.Text;
namespace WindowsApplication4
public class QueueManager
public static Queue<System.Windows.Forms.Message> MessageList = new Queue<System.Windows.Forms.Message>();
private static System.Threading.Thread thread = null;
public delegate void DThreadProcDelegate();
public static DThreadProcDelegate ThreadProcDelegate = null;
public static void BeginProcessQueue()
if (ThreadProcDelegate != null)
thread = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProcDelegate));
thread.Start();
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication4
public partial class Form1 : Form
public Form1()
InitializeComponent();
protected override void WndProc(ref Message m)
QueueManager.MessageList.Enqueue(m);
base.WndProc(ref m);
写一个处理函数不停的从MessageList里面Dequeue出一个Message并处理的函数和delegate挂上就可以了本回答被提问者采纳
以上是关于求一个异步处理消息的方法的主要内容,如果未能解决你的问题,请参考以下文章