gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:50:44 24 4
gpt4 key购买 nike

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

基于此,我猜想我的问题的答案是 SmsMessage 对象不是线程安全的,尽管实际上并没有迹象表明情况确实如此。

那么如果我们想尝试线程化一个 SmsMessage 对象怎么办?今晚我将通过制作 SmsMessage 的副本(可能通过使用带项目 ID 的构造函数)来尝试,或者我将创建一个空的并手动复制字段。

发现:

我缩小了问题范围。当我将 SmsMessage 复制到我自己的对象中时,我能够让所有内容在后台线程中工作,注意不要引用任何 SmsMessage 的对象。短信顺利通过。

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

因此,只要您不传递/使用 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 拦截器线程有什么意义?这不像一部手机可以同时收到 2 条短信。

关于c# - SmsMessage 不是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/421801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com