目前,在处理IOS推送通知时,我想维护多个线程之间的徽章数。它们是n个线程,每个线程都有计数器的副本,线程1有计数器值4,thread2计数器可能有值6,所有这些线程都向APNS发送信息,这导致错误的批量计数或IOS设备上的计数器
如何在所有线程之间同步计数器的更新值,如果最新计数为30,则所有相应的线程计数都会更新为30,因此信息保持一致。
以下是代码。
new System.Threading.Thread(() =>
{
try
{
pushNotification.SendIOSPushNotification();
}
catch (Exception ex)
{
Util.LogElmahError(ex);
}
}).Start();
return userdevices;
}
public void SendIOSPushNotification()
{
// Count increased in sequential order and shared between multiple threads,
// how we can maintain the updated state between all the threads.
// UnreadCount
unreadcount = DatabaseCall();
// Send information to APNS
apnsBroker.QueueNotification(new ApnsNotification
{
DeviceToken = token.AuthToken,
Payload = JObject.Parse(
"{\"aps\":{\"badge\":" + UnreadCount.MessageID + ",\"alert\":" +
jsonAlert + ",\"sound\":\"sound.caf\"},\"jsoncontent\":" + jsonContent + "}")
});
}
答案 0 :(得分:1)
您可以使用volatile修饰符来处理此类情况。
volatile修饰符通常用于访问的字段 多个线程没有使用lock语句来序列化访问。 使用volatile修饰符可确保一个线程检索最多 另一个线程写的最新值。
答案 1 :(得分:0)
volatile修饰符是一种解决方案,但是,您可以使用Interlocked
static methods添加和读取值:
var localCount = DatabaseCall();
Interlocked.Add(ref unreadcount, localCount);
Read from a int
variable are atomic,但您仍需将该字段标记为volatile
。对于long
值读取,您可以使用
var allCount = Interlocked.Read(ref unreadcountLong);