نماذج التعليمات البرمجية لتخزين قائمة انتظار Azure باستخدام مكتبات عميل .NET الإصدار 11.x

تعرض هذه المقالة نماذج التعليمات البرمجية التي تستخدم الإصدار 11.x من مكتبة عميل Azure Queue Storage ل .NET.

في 31 مارس 2023، قمنا بإيقاف الدعم لمكتبات Azure SDK التي لا تتوافق مع إرشادات Azure SDK الحالية. يتم تحديث مكتبات Azure SDK الجديدة بانتظام لدفع تجارب متسقة وتعزيز وضع الأمان الخاص بك. يوصى بالانتقال إلى مكتبات Azure SDK الجديدة للاستفادة من الإمكانات الجديدة وتحديثات الأمان الهامة.

على الرغم من أنه لا يزال من الممكن استخدام المكتبات القديمة بعد 31 مارس 2023، إلا أنها لن تتلقى الدعم والتحديثات الرسمية من Microsoft. لمزيد من المعلومات، راجع إعلان إيقاف الدعم.

للحصول على نماذج التعليمات البرمجية باستخدام أحدث إصدار من مكتبة العميل 12.x، راجع التشغيل السريع: مكتبة عميل Azure Queue Storage ل .NET.

إنشاء عميل Queue Storage

تُمكّنك الفئة CloudQueueClient من استرداد قوائم الانتظار المخزنة في Queue Storage. إليك إحدى الطرق لإنشاء عميل الخدمة:

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

قم بإنشاء قائمة انتظار

يوضح هذا المثال كيفية إنشاء قائمة انتظار:

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

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

إدراج رسالة في قائمة انتظار

لإدراج رسالة ضمن قائمة انتظار موجودة، قم أولًا بإنشاء CloudQueueMessageجديدة. بعد ذلك، قم باستدعاء أسلوب AddMessage. يمكن إنشاء CloudQueueMessage إما من سلسلة (بتنسيق UTF-8) أو مصفوفة بايت. ينشئ مثال التعليمات البرمجية التالي قائمة انتظار (إذا لم تكن موجودة بالفعل) ويدرج الرسالة Hello, World:

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

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

// Create a message and add it to the queue
CloudQueueMessage message = new CloudQueueMessage("Hello, World");
queue.AddMessage(message);

نظرة خاطفة على الرسالة التالية

يمكنك إلقاء نظرة خاطفة على الرسائل الموجودة في قائمة الانتظار دون إزالتها من قائمة الانتظار عن طريق استدعاء الأسلوب PeekMessage.

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

// Peek at the next message
CloudQueueMessage peekedMessage = queue.PeekMessage();

// Display message.
Console.WriteLine(peekedMessage.AsString);

تغيير محتويات رسالة في قائمة الانتظار

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

// Get the message from the queue and update the message contents.
CloudQueueMessage message = queue.GetMessage();
message.SetMessageContent2("Updated contents.", false);
queue.UpdateMessage(message,
    TimeSpan.FromSeconds(60.0),  // Make it invisible for another 60 seconds.
    MessageUpdateFields.Content | MessageUpdateFields.Visibility);

حذف الرسالة التالية من القائمة

تحذف التعليمات البرمجية الرسالة من قائمة الانتظار في خطوتين. عندما تستدعي GetMessage، تظهر الرسالة التالية في قائمة انتظار. تصبح رسالة التي تم إرجاعها من GetMessage غير مرئية إلى أية تعليمات برمجية أخرى قراءة الرسائل من قائمة الانتظار هذه. بشكل افتراضي، تبقى هذه الرسالة غير مرئية لمدة 30 ثانية. لإنهاء إزالة الرسالة من قائمة الانتظار، يجب عليك أيضا الاتصال DeleteMessage. تؤكد هذه العملية ذات الخطوتين لإزالة رسالة أنه إذا فشلت التعليمات البرمجية في معالجة رسالة بسبب فشل الأجهزة أو البرامج، يمكن لمثيل آخر من التعليمات البرمجية الحصول على نفس الرسالة والمحاولة مرة أخرى. تستدعي تعليماتك البرمجية DeleteMessage مباشرة بعد معالجة الرسالة.

// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

// Get the next message
CloudQueueMessage retrievedMessage = queue.GetMessage();

//Process the message in less than 30 seconds, and then delete the message
queue.DeleteMessage(retrievedMessage);

استخدم نمط الانتظار غير المتزامن مع واجهات برمجة تطبيقات تخزين قائمة الانتظار الشائعة

// Create the queue if it doesn't already exist
if(await queue.CreateIfNotExistsAsync())
{
    Console.WriteLine("Queue '{0}' Created", queue.Name);
}
else
{
    Console.WriteLine("Queue '{0}' Exists", queue.Name);
}

// Create a message to put in the queue
CloudQueueMessage cloudQueueMessage = new CloudQueueMessage("My message");

// Async enqueue the message
await queue.AddMessageAsync(cloudQueueMessage);
Console.WriteLine("Message added");

// Async dequeue the message
CloudQueueMessage retrievedMessage = await queue.GetMessageAsync();
Console.WriteLine("Retrieved message with content '{0}'", retrievedMessage.AsString);

// Async delete the message
await queue.DeleteMessageAsync(retrievedMessage);
Console.WriteLine("Deleted message");

استخدام الخيارات الإضافية لحذف الرسائل من القائمة

يستخدم مثال التعليمة البرمجية التالي طريقة GetMessages للحصول على 20 رسالة في الاستدعاء الواحد. ثم يقوم بمعالجة كل رسالة داخل كل دفعة باستخدام متداخلة التكرار الحلقيforeach. كما أنه يحدّد مهلة عدم رؤية إلى خمس دقائق لكل رسالة. تبدأ المهلة لجميع الرسائل في نفس الوقت، لذلك بعد مرور خمس دقائق منذ استدعاء GetMessages، ستصبح أي رسائل لم يتم حذفها مرئية مرة أخرى.

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

foreach (CloudQueueMessage message in queue.GetMessages(20, TimeSpan.FromMinutes(5)))
{
    // Process all messages in less than 5 minutes, deleting each message after processing.
    queue.DeleteMessage(message);
}

الحصول على طول قائمة الانتظار

يمكنك الحصول على تقدير لعدد الرسائل في قائمة انتظار. تعيد طريقة FetchAttributes خصائص قائمة الانتظار بما في ذلك عدد الرسائل. تعيد الخاصية ApproximateMessageCount القيمة الأخيرة التي تم استردادها بواسطة طريقة FetchAttributes الطريقة، دون استدعاء Queue Storage.

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

// Fetch the queue attributes.
queue.FetchAttributes();

// Retrieve the cached approximate message count.
int cachedMessageCount = queue.ApproximateMessageCount;

// Display number of messages.
Console.WriteLine("Number of messages in queue: " + cachedMessageCount);

حذف قائمة انتظار

لحذف قائمة انتظار وكافة الرسائل المضمنة فيه، استدعىي الأسلوب Deleteعلى عنصر قائمة الإنتظار.

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

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

// Delete the queue.
queue.Delete();

العمل مع قوائم الانتظار

مقالة ذات صلة: العمل مع قوائم انتظار Azure Queue Storage في .NET

في دليل المشروع الخاص بك، أضف الحزم التالية باستخدام dotnet add package الأمر :

dotnet add package Microsoft.Azure.Storage.Common
dotnet add package Microsoft.Azure.Storage.Queue

نموذج التعليمات البرمجية الكامل:

using System;
using System.Threading.Tasks;
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Queue;

namespace QueueApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
            CloudQueue queue = queueClient.GetQueueReference("mystoragequeue");

            if (args.Length > 0)
            {
                string value = String.Join(" ", args);
                await InsertMessageAsync(queue, value);
                Console.WriteLine($"Sent: {value}");
            }
            else
            {
                string value = await RetrieveNextMessageAsync(queue);
                Console.WriteLine($"Received: {value}");
            }

            Console.Write("Press Enter...");
            Console.ReadLine();
        }

        static async Task InsertMessageAsync(CloudQueue theQueue, string newMessage)
        {
            if (await theQueue.CreateIfNotExistsAsync())
            {
                Console.WriteLine("The queue was created.");
            }

            CloudQueueMessage message = new CloudQueueMessage(newMessage);
            await theQueue.AddMessageAsync(message);
        }

        static async Task<string> RetrieveNextMessageAsync(CloudQueue theQueue)
        {
            bool exists = await theQueue.ExistsAsync();

            if (exists)
            {
                CloudQueueMessage retrievedMessage = await theQueue.GetMessageAsync();

                if (retrievedMessage != null)
                {
                    string theMessage = retrievedMessage.AsString;
                    await theQueue.DeleteMessageAsync(retrievedMessage);
                    return theMessage;
                }
                else
                {
                    Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
                    string response = Console.ReadLine();

                    if (response.ToUpper() == "Y")
                    {
                        await theQueue.DeleteIfExistsAsync();
                        return "The queue was deleted.";
                    }
                    else
                    {
                        return "The queue was not deleted.";
                    }
                }
            }
            else
            {
                return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
            }
        }
    }
}