2016-05-20 7 views
0

Ich habe ein Projekt, das Produktfeeddateien in meinem System verarbeitet. Für eine bestimmte Feed-Datei dauert der gesamte Prozess etwa 40-50 Minuten. Jetzt habe ich eine WebJob erstellt, um Bilder aus dem Feed zu verarbeiten, und ich sende Bild URLs von meinem ersten Projekt an WebJob durch Erstellen von Speicher-Client. Als ich das zu meinem Projekt hatte, erhöhte es die Verarbeitungszeit erheblich, also versuchte ich, es mit Task.Run zu verwenden, um Fire and Forget Ansatz zu verwenden, aber noch mit dieser Gesamtprozesszeit ist jetzt ungefähr 2 Stunden.Das Erstellen einer Speicherwarteschlange in Task.Run verdoppelt meine Verarbeitungszeit.

Hier ist, wie ich meine Methode aufrufen, die Speicherwarteschlange erstellt.

if (insertImages) 
{ 
    #pragma warning disable 4014 
    Task.Run(async() => { await new QueueUtility().CreateQueueMessage(picture); }).ConfigureAwait(false); 
    #pragma warning restore 4014 
} 

Und hier ist mein Code Warteschlange Nachricht

public async Task CreateQueueMessage(Picture picture) 
    { 
      Utility.Log log = new Utility.Log(); 
      await AddQueueMessage(picture.url); 

    } 


public async Task AddQueueMessage(string queueMessage) 
    { 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("ImagekWebJobStorage")); 

     // Create the queue client. 
     CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient(); 

     // Retrieve a reference to a container. 
     CloudQueue queue = queueClient.GetQueueReference("imagekqueue"); 

     // Create the queue if it doesn't already exist 
     queue.CreateIfNotExists(); 

     // Create a message and add it to the queue. 
     CloudQueueMessage message = new CloudQueueMessage(queueMessage); 
     queue.AddMessage(message); 

    } 

Ich verstehe nicht, warum meine Verarbeitungszeit verdoppelt und kann nicht einen Weg zu umgehen, dass entweder finden zu erstellen. Irgendwelche Ideen, die mir helfen würden, das zu lösen, wären wirklich hilfreich.

Antwort

0

Zwei Dinge:

1 - Sie versuchen, Ihre Warteschlange mit jedem Aufruf AddQueueMessage() zu erstellen. Dies ist eine unnötige Rundreise.

2 - versuchen Nagle-Algorithmus Ausschalten via

ServicePointManager.UseNagleAlgorithm=false;

Andernfalls kleinere TCP-Pakete von 1/2-Sekunden-Verzögerung nach oben sein kann.

+0

für 1. Punkt, meinst du 'queue.CreateIfNotExists()'? – erincerol

+1

Ja, Sie müssen dies weiterhin tun, es sei denn, Sie erstellen mit jedem Anruf neue Warteschlangen. Viel effizienter, um Warteschlangen im Voraus einzurichten. –

+0

Auch jeder Aufruf von Creatifnotexists verursacht Transaktionsgebühren. Sie können es lokal zwischenspeichern, nachdem Sie es einmal aufgerufen haben. Nicht zu viel Kosten, aber immer noch gut, um zu sparen, was immer Sie können –

Verwandte Themen