c# - SmsMessage不是线程安全的吗?

标签 c# windows-mobile

我正在为 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/

相关文章:

windows-mobile - Windows Mobile 模拟器与主机联网

c# - Excel 上的 OLEDB 查询不带标题 : How do I specify Columns?

c# - 如何在 Windows 移动设备上获取以 KB 为单位的 GPRS 总使用量?

c# - LINQ to Entities 仅支持无参数构造函数和初始值设定项。 (ASP.NET 网络 API)

C# MVC5 View 无法识别命名空间

api - 哪些设备制造商拥有自己的 Java ME API

c# - 拦截 C# webbrowser 的超链接

windows-mobile - Windows Mobile 6 CPU 架构?

c# - 如何从 ElapsedEventHandler 中调用异步方法

C#计算在const和variable locals之间有所不同?