我正在为 WM 编写一个应用程序来处理传入的 SMS 事件。我尝试使其成为多线程(使用 ThreadPool.QueueWorkItem),其中 SmsMessage 被传递。但是,我注意到,当我这样做时,程序只会处理第一个短信事件 - 此后,设备根本没有收到任何短信!但是当程序退出时,所有错过的短信都到达了。
基于此,我猜我的问题的答案是 SmsMessage 对象不是线程安全的,尽管没有真正的迹象表明情况确实如此。
如果我们想尝试线程化 SmsMessage 对象怎么办?今晚我将通过制作 SmsMessage 的副本(可能使用带有项目 id 的构造函数)来尝试一下,或者我将创建一个空的副本并手动复制字段。
发现:
我缩小了问题范围。当我将 SmsMessage 复制到我自己的对象中时,我能够让一切在后台线程中工作,注意不要引用任何 SmsMessage 的对象。短信顺利通过。
但是,当我设置 MessageIntercepter 来启动应用程序,并在该应用程序实例中使用后台线程发送短信时,该应用程序可以正常工作,但在退出我的代码后它会崩溃并显示“There yourapp.exe 中出现错误”并询问我是否要将崩溃数据发送给 MS。我永远无法弄清楚该错误是什么,但我发现如果我从启动应用程序的同一个线程发送短信,一切都会正常工作。
因此,只要您不传递/使用 SmsMessage,应用程序打开时的线程就可以了 外部启动应用程序时的线程 = 很好,只要您不在另一个线程中发送 SmsMessage。
最佳答案
根据MSDN Library (Microsoft.WindowsMobile.PocketOutlook.SmsMessage) :
Any public static (Shared in Visual Basic) members of this type are thread-safe. Any instance members are not guaranteed to be thread-safe.
所以你的问题的答案是:它不是线程安全的。
编辑:我很高兴你设法让这个东西正常工作。我很确定这是 PocketOutlook 库深处的一些竞争条件或非托管资源处理问题。
就我个人而言,我认为您应该将所有与消息传递相关的代码保留在一个线程中,从 MessageInterceptor 创建的点到它被释放的点,并且只传递您编写的对象,这样您就知道它们不会有狡猾的非托管依赖项(我认为这就是你所做的) - 这应该足以避免这些问题。
拥有 2 个 SMS 拦截器线程有什么意义?一部手机不可能同时收到两条短信。
关于c# - SmsMessage不是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/421801/