2016-04-05 6 views
0

Ich benutze Push Sharp Version PushSharp 4.0.4.Wie Batch-Warteschlange Datensätze und führen Sie sie in einem anderen Thread und warten bis es; s vorbei?

Ich benutze es in einer Windows-Anwendung.

Ich habe drei Hauptmethoden

1- BroadCastToAll

2- BrodcatsToIOS

3- BrodcatsToAndriod

Ich habe eine Schaltfläche calld Senden. Auf das Klickereignis der Schaltfläche. Ich rufe die

BroadCastToAll Funktion an.

private void btnSend_Click(object sender, EventArgs e) 
{ 
    var url = "www.mohammad-jouhari.com" 
    var promotion = new Promotion(); 
    BroadCastToAll(promotion, url); 
} 

ist die BrodcastToAll Funktion

public void BroadCastToAll(Promotion promotion, string url) 
{ 
    var deviceCatalogs = GetDeviceCatalog(); 
    BroadCastToIOS(promotion, url, deviceCatalogs.Where(d => d.OS == "IOS").ToList()); 
    BroadCastToAndriod(promotion, url, deviceCatalogs.Where(d => d.OS == "Android").ToList()); 
} 

Hier ist die BrodcastToIOS Funktion

public void BroadCastToIOS(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs) 
{ 
    if (deviceCatalogs.Count == 0) 
     return; 
     lock (_lock)// Added this lock because there is a potential chance that PushSharp callback execute during registering devices 
     { 
      QueueAllAppleDevicesForNotification(promotion, url, deviceCatalogs, logsMessage); 
     } 
} 

public void BroadCastToAndriod(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs) 
{ 
    if (deviceCatalogs.Count == 0) 
     return; 
     lock (_lock)// Added this lock because there is a potential chance that PushSharp callback execute during registering devices 
     { 
      QueueAllGcmDevicesForNotification(promotion, url, deviceCatalogs, logsMessage); 
     } 
} 

Hier ist die BrodcastToAndriod Funktion Hier ist die QueueAllAppleDevic esForNotification Funktion

private void QueueAllAppleDevicesForNotification(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs) 
     { 
      var apnsServerEnviroment = UseProductionCertificate ? ApnsConfiguration.ApnsServerEnvironment.Production : ApnsConfiguration.ApnsServerEnvironment.Sandbox; 
      var fileService = new FileService(); 
      var filePath = Application.StartupPath+ "/Certifcates/" + (UseProductionCertificate ? "prod.p12" : "dev.p12"); 
      var buffer = fileService.GetFileBytes(filePath); 
      var config = new ApnsConfiguration(apnsServerEnviroment, buffer, APPLE_CERTIFICATE_PWD); 
      apnsServiceBroker = new ApnsServiceBroker(config); 
      apnsServiceBroker.OnNotificationFailed += (notification, aggregateEx) => { 
       aggregateEx.Handle (ex => { 
        // Log the Resposne 
       }); 

      }; 
      apnsServiceBroker.OnNotificationSucceeded += (notification) => { 
        // Log The Response 
      }; 
      apnsServiceBroker.Start(); 
      foreach (var deviceToken in deviceCatalogs) { 
       var title = GetTitle(promotion, deviceToken); 
       //title += DateTime.UtcNow.TimeOfDay.ToString(); 
       var NotificationPayLoadObject = new NotificationPayLoadObjectApple(); 
       NotificationPayLoadObject.aps.alert = title; 
       NotificationPayLoadObject.aps.badge = 0; 
       NotificationPayLoadObject.aps.sound = "default"; 
       NotificationPayLoadObject.url = url; 
       var payLoad = JObject.Parse(JsonConvert.SerializeObject(NotificationPayLoadObject)); 
       apnsServiceBroker.QueueNotification(new ApnsNotification 
       { 
        Tag = this, 
        DeviceToken = deviceToken.UniqueID, 
        Payload = payLoad 
       }); 
      } 
      var fbs = new FeedbackService(config); 
      fbs.FeedbackReceived += (string deviceToken, DateTime timestamp) => 
      { 
       // This Token is no longer avaialble in APNS 
       new DeviceCatalogService().DeleteExpiredIosDevice(deviceToken); 
      }; 
      fbs.Check(); 

      apnsServiceBroker.Stop(); 
     } 

Und hier ist der QueueAllGcmDevicesForNotification

private void QueueAllGcmDevicesForNotification(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs,) 
    { 
     var config = new GcmConfiguration(ANDROID_SENDER_ID, ANDROID_SENDER_AUTH_TOKEN, ANDROID_APPLICATION_ID_PACKAGE_NAME); 
     gcmServiceBroker = new GcmServiceBroker(config); 
     gcmServiceBroker.OnNotificationFailed += (notification, aggregateEx) => { 
      aggregateEx.Handle (ex => { 
       // Log Response 
       return true; 
      }); 
     }; 

     gcmServiceBroker.OnNotificationSucceeded += (notification) => { 
      // Log Response 
     }; 
     var title = GetTitle(shopexPromotion); 
     gcmServiceBroker.Start(); 
     foreach (var regId in deviceCatalogs) { 
      var NotificationPayLoadObject = new NotificationPayLoadObjectAndriod(url, title, "7", promotion.ImageUrl); 
      var payLoad = JObject.Parse(JsonConvert.SerializeObject(NotificationPayLoadObject)); 
      gcmServiceBroker.QueueNotification(new GcmNotification 
      { 
       RegistrationIds = new List<string> { 
        regId.UniqueID 
       }, 
       Data = payLoad 
      }); 
     } 
     gcmServiceBroker.Stop(); 

    } 

Wenn ich jetzt auf die Schaltfläche Senden klicken. Das Ereignis wird ausgeführt.

Die BrodcastToAll-Funktion wird aufgerufen. Ich rufe zunächst BrodcastToIOS-Geräte und dann BrodcatsToAndriod an.

Gibt es eine Möglichkeit, BrodcastToIOS aufzurufen und zu warten, bis alle Geräte in die Warteschlange eingereiht wurden und die Benachrichtigung von der Bibliothek gepusht wurde und die Rückrufereignisse vollständig ausgelöst wurden, dann die BrodcastToAndriod-Funktion ausführen?

Welche Codezeilen muss ich hinzufügen?

Gibt es auch eine Möglichkeit, die Anzahl der einzureihenden Geräte im Stapel zu verarbeiten?

Zum Beispiel.

Lassen Sie uns sagen, ich habe 1000 Geräte

500 IOS

500 Andriod

Kann ich 100, 100100100100 für IOS Warteschlange und wenn es

ich für Andriod Warteschlange 100.100.100.100.100 getan hat.

Jede Hilfe wird geschätzt.

Danke.

Antwort

0

Der Aufruf von broker.Stop() wird standardmäßig blockiert, bis alle Benachrichtigungen aus der Warteschlange verarbeitet wurden.

+0

ich es verwenden und es blockiert nicht – user123456

+0

https://github.com/Redth/PushSharp/blob/master/PushSharp.Core/ServiceBroker.cs#L70-L95 Es blockiert ... – Redth

+0

ok er verwendet Task.WaitAll (alle); Muss ich es in meinem Code verwenden? – user123456