求一个异步处理消息的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个异步处理消息的方法相关的知识,希望对你有一定的参考价值。

将窗口收到的消息在新的线程中按消息的先后顺序处理,而不阻塞窗口的线程。要求新线程处理完前一个消息后要自动感知下一个消息并自动处理。
希望提供主要的框架的代码。
Re:lcg1986
经试验这个办法在每次处理了前几个消息后发生“System.ExecutionEngineException”类型的异常。异常发生在辅助线程的消息处理方法里的
MyStruct myStruct = (MyStruct)Marshal.PtrToStructure(m.LParam, typeof(MyStruct));
即根据消息的LParam指针读取数据缓冲区的数据。
缓冲区的数据是主窗口通过商业数据接收软件接收到,接收方式是该软件给启动它的窗口发消息,并向缓冲区发数据。
使用这个办法在前头几个消息的正常处理中如果关闭接收软件也会立即引发这个异常。
如果不用辅助线程则不出现这个异常。
不知是否和线程间传递消息有关,或者是缓冲区损坏的问题,或者异步读取缓冲区有什么讲究。
网上还有人说因为.net有垃圾回收装置也就是说他的地址内容可能是不定的,Marshal.PtrToStructure把它写入托管内存。它的指针域,可能是错误的。

我的意见就是参考一下消息对列。如果感觉看MFC的消息对列不直观的话,就参考大多书上都有的。自己写窗体。然后看消息怎么处理。 参考技术A 其实很简单:

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挂上就可以了本回答被提问者采纳

以上是关于求一个异步处理消息的方法的主要内容,如果未能解决你的问题,请参考以下文章

Handler与异步消息处理

Handler与异步消息处理

根据消息类型对消息进行不同的处理(消除if else,通过方法注解方式实现不同消息的处理-支持异步)

Android异步消息机制

Android 异步消息处理机制

基于RabbitMQ实现异步消息通知处理