通过所有主题更新计数器值

时间:2017-04-10 06:54:09

标签: c# multithreading apple-push-notifications

目前,在处理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 + "}")
    });
}

2 个答案:

答案 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);