SmsMessage不是线程安全的吗?

时间:2009-01-07 19:47:44

标签: c# windows-mobile

我正在为WM编写一个处理传入SMS事件的应用程序。我尝试使用多线程(使用ThreadPool.QueueWorkItem)传递SmsMessage。但是,我注意到,当我这样做时,该程序只处理第一个短信事件 - 之后,设备根本没有接收到短信!但是当程序退出时,所有错过的短信都会到达。

基于此,我猜我的问题的答案是SmsMessage对象不是线程安全的,即使实际上没有迹象表明是这种情况。

那么如果我们想尝试并编写一个SmsMessage对象呢?我今晚将通过制作SmsMessage的副本(可能通过使用构造函数w / item id)来尝试,或者我将创建一个空的并手动复制字段。

DISCOVERY:

我缩小了我的问题范围。当我将SmsMessage复制到我自己的对象中时,我能够在后台线程中完成所有工作,注意不要引用任何SmsMessage的对象。短信毫无问题地飞了过来。

但是,当我设置MessageIntercepter来启动应用程序时,在该应用程序实例中,使用后台线程发送短信,应用程序可以正常工作,但在它退出我的代码后它会崩溃并显示“那里是yourapp.exe中的错误“并询问我是否要将崩溃数据发送给MS。我永远无法弄清楚那个错误是什么,但我发现如果我从启动应用程序的同一个线程发送短信,一切都运行良好。

因此,只要您不传递/使用SmsMessage,当应用程序打开时线程正常=罚款 外部启动应用程序时的线程=很好,只要你不在另一个线程中发送SmsMessage。

2 个答案:

答案 0 :(得分:2)

根据MSDN Library (Microsoft.WindowsMobile.PocketOutlook.SmsMessage)

  

Visual中的任何公共静态(共享)   基本)这种类型的成员是   线程安全的。任何实例成员都是   不保证是线程安全的。

所以你的问题的答案是:它不是线程安全的

编辑:我很高兴你设法让这件事工作。我很确定这是PocketOutlook库中的一些竞争条件或非托管资源处理问题。

就我个人而言,我认为你应该将所有与消息传递相关的代码保存在一个线程中,从MessageInterceptor创建的那一刻起直到它被处理的那一点为止,只传递你写的对象,这样你就知道它们不会有狡猾的无管理的眷属(这就是我认为的那种) - 这应该足以避免这些问题。

有两条SMS拦截器线程有什么意义?这并不像手机可以同时收到2条短信。

答案 1 :(得分:1)

如果没有看到更多代码,很难猜出发生了什么。我强烈怀疑你的线程代码而不是SmsMessage是一个问题。

如果您可以解释应用程序的体系结构,那将会有很大帮助。我发现你的某个地方阻塞了所有东西,我不会感到惊讶。