SmsMessage не является потокобезопасным? - PullRequest
2 голосов
/ 07 января 2009

Я пишу приложение для WM, которое обрабатывает входящие SMS-события. Я попытался сделать его многопоточным (используя ThreadPool.QueueWorkItem), где было передано сообщение SmsMessage. Тем не менее, я заметил, что когда я это сделал, программа будет обрабатывать только первое смс-событие - после этого устройство вообще не получало никаких СМС! Но когда программа закрывается, приходят все пропущенные SMS.

Исходя из этого, я предполагаю, что ответ на мой вопрос заключается в том, что объекты SmsMessage НЕ являются поточно-ориентированными, даже если на самом деле нет признаков того, что это так.

Так что, если мы хотим попробовать создать поток SmsMessage Object? Я попробую это сегодня вечером, сделав копию сообщения SmsMessage (возможно, используя конструктор с идентификатором элемента), или создам пустое и скопирую поля вручную.

DISCOVERY:

Я сузил свою проблему. Мне удалось заставить все работать в фоновом потоке, когда я скопировал SmsMessage в свой собственный объект, стараясь не ссылаться ни на один из объектов SmsMessage. СМС летали без проблем.

Однако, когда я настроил MessageIntercepter для запуска приложения и в этом экземпляре приложения использовал фоновый поток для отправки SMS, приложение работало бы нормально, но после выхода из моего кода оно вылетало и отображало была ошибка в yourapp.exe "и спрашивает меня, хотите ли вы отправить данные о сбое в MS. Я никогда не мог понять, что это за ошибка, но я обнаружил, что если я отправляю SMS из того же потока, который запустил приложение, все работает нормально.

Итак, многопоточность, когда приложение открыто = нормально, если вы не передаете / не используете SmsMessage Потоки при внешнем запуске приложения = отлично, если вы не отправляете сообщение SmsMessage в другой поток.

Ответы [ 2 ]

2 голосов
/ 07 января 2009

По данным библиотеки MSDN (Microsoft.WindowsMobile.PocketOutlook.SmsMessage) :

Любая общедоступная статическая ( Общая в Visual Основные) члены этого типа потокобезопасный. Любые члены экземпляра не гарантированно является потокобезопасным.

Итак, ответ на ваш вопрос: это не поточно-ориентированный .

РЕДАКТИРОВАТЬ : Я рад, что вам удалось заставить эту штуку работать. Я почти уверен, что в библиотеке PocketOutlook есть проблема с нехваткой ресурсов или неуправляемая обработка ресурсов.

Лично я думаю, что вы должны хранить весь свой код, связанный с сообщениями, в одном потоке, начиная с момента, когда создан MessageInterceptor, и заканчивая тем, как он удаляется, и пропускайте только те объекты, которые написаны вами, чтобы вы знали, что они иметь неясные неуправляемые зависимости (это то, что вы, я думаю, сделали) - этого должно быть достаточно, чтобы избежать этих проблем.

Какой смысл иметь 2 потока SMS-перехватчиков? Телефон не может получать 2 текстовых сообщения одновременно.

1 голос
/ 07 января 2009

Не видя больше кода, трудно угадать, что происходит. Я сильно подозреваю, что это была проблема с вашим многопоточным кодом, а не с SmsMessage.

Если бы вы могли объяснить архитектуру вашего приложения, это бы очень помогло. Я бы не удивился, обнаружив, что у вас где-то возникла тупиковая ситуация, которая блокирует все.

...