

第 4 版 (V4) 適用於 .NET 的 AWS SDK 已發行！

如需有關中斷變更和遷移應用程式的資訊，請參閱[遷移主題](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)。

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 接收 Amazon SQS 訊息
<a name="ReceiveMessage"></a>

此範例說明如何使用 適用於 .NET 的 AWS SDK 接收來自 Amazon SQS 佇列的訊息，您可以透過[程式設計方式](CreateQueue.md)或使用 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs)建立。應用程式會從佇列讀取單一訊息、處理訊息 （在此情況下， 會在主控台上顯示訊息內文），然後從佇列刪除訊息。應用程式會重複這些步驟，直到使用者在鍵盤上輸入金鑰為止。

此範例和[先前有關傳送訊息的範例](SendMessage.md)可以一起使用，以查看 Amazon SQS 中的訊息流程。

下列各節提供此範例的程式碼片段。之後會顯示[範例的完整程式碼](#ReceiveMessage-complete-code)，並可依原樣建置和執行。

**Topics**
+ [接收訊息](#ReceiveMessage-receive)
+ [刪除訊息](#ReceiveMessage-delete)
+ [完成程式碼](#ReceiveMessage-complete-code)
+ [其他考量](#ReceiveMessage-additional)

## 接收訊息
<a name="ReceiveMessage-receive"></a>

下列程式碼片段會從指定佇列 URL 識別的佇列接收訊息。

[本主題結尾](#ReceiveMessage-complete-code)的範例顯示此程式碼片段正在使用中。

```
    //
    // Method to read a message from the given queue
    // In this example, it gets one message at a time
    private static async Task<ReceiveMessageResponse> GetMessage(
      IAmazonSQS sqsClient, string qUrl, int waitTime=0)
    {
      return await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest{
        QueueUrl=qUrl,
        MaxNumberOfMessages=MaxMessages,
        WaitTimeSeconds=waitTime
        // (Could also request attributes, set visibility timeout, etc.)
      });
    }
```

## 刪除訊息
<a name="ReceiveMessage-delete"></a>

下列程式碼片段會從指定佇列 URL 識別的佇列中刪除訊息。

[本主題結尾](#ReceiveMessage-complete-code)的範例顯示此程式碼片段正在使用中。

```
    //
    // Method to delete a message from a queue
    private static async Task DeleteMessage(
      IAmazonSQS sqsClient, Message message, string qUrl)
    {
      Console.WriteLine($"\nDeleting message {message.MessageId} from queue...");
      await sqsClient.DeleteMessageAsync(qUrl, message.ReceiptHandle);
    }
```

## 完成程式碼
<a name="ReceiveMessage-complete-code"></a>

本節顯示此範例的相關參考和完整程式碼。

### 開發套件參考
<a name="w2aac19c15c29c25c21b5b1"></a>

NuGet 套件：
+ [AWSSDK.SQS](https://www.nuget.org/packages/AWSSDK.SQS)

程式設計元素：
+ 命名空間 [Amazon.SQS](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/SQS/NSQS.html)

  [AmazonSQSClient](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/SQS/TSQSClient.html) 類別
+ 命名空間 [Amazon.SQS.Model](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/SQS/NSQSModel.html)

  類別 [ReceiveMessageRequest](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/SQS/TReceiveMessageRequest.html)

  類別 [ReceiveMessageResponse](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/SQS/TReceiveMessageResponse.html)

### 程式碼
<a name="w2aac19c15c29c25c21b7b1"></a>

```
using System;
using System.Threading.Tasks;
using Amazon.SQS;
using Amazon.SQS.Model;

namespace SQSReceiveMessages
{
  class Program
  {
    private const int MaxMessages = 1;
    private const int WaitTime = 2;
    static async Task Main(string[] args)
    {
      // Do some checks on the command-line
      if(args.Length == 0)
      {
        Console.WriteLine("\nUsage: SQSReceiveMessages queue_url");
        Console.WriteLine("   queue_url - The URL of an existing SQS queue.");
        return;
      }
      if(!args[0].StartsWith("https://sqs."))
      {
        Console.WriteLine("\nThe command-line argument isn't a queue URL:");
        Console.WriteLine($"{args[0]}");
        return;
      }

      // Create the Amazon SQS client
      var sqsClient = new AmazonSQSClient();

      // (could verify that the queue exists)
      // Read messages from the queue and perform appropriate actions
      Console.WriteLine($"Reading messages from queue\n  {args[0]}");
      Console.WriteLine("Press any key to stop. (Response might be slightly delayed.)");
      do
      {
        var msg = await GetMessage(sqsClient, args[0], WaitTime);
        if(msg.Messages.Count != 0)
        {
          if(ProcessMessage(msg.Messages[0]))
            await DeleteMessage(sqsClient, msg.Messages[0], args[0]);
        }
      } while(!Console.KeyAvailable);
    }


    //
    // Method to read a message from the given queue
    // In this example, it gets one message at a time
    private static async Task<ReceiveMessageResponse> GetMessage(
      IAmazonSQS sqsClient, string qUrl, int waitTime=0)
    {
      return await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest{
        QueueUrl=qUrl,
        MaxNumberOfMessages=MaxMessages,
        WaitTimeSeconds=waitTime
        // (Could also request attributes, set visibility timeout, etc.)
      });
    }


    //
    // Method to process a message
    // In this example, it simply prints the message
    private static bool ProcessMessage(Message message)
    {
      Console.WriteLine($"\nMessage body of {message.MessageId}:");
      Console.WriteLine($"{message.Body}");
      return true;
    }


    //
    // Method to delete a message from a queue
    private static async Task DeleteMessage(
      IAmazonSQS sqsClient, Message message, string qUrl)
    {
      Console.WriteLine($"\nDeleting message {message.MessageId} from queue...");
      await sqsClient.DeleteMessageAsync(qUrl, message.ReceiptHandle);
    }
  }
}
```

## 其他考量
<a name="ReceiveMessage-additional"></a>
+ 若要指定長輪詢，此範例會針對 `ReceiveMessageAsync`方法的每個呼叫使用 `WaitTimeSeconds` 屬性。

  您也可以在[建立](CreateQueue.md)或[更新](UpdateSqsQueue.md)佇列時使用 `ReceiveMessageWaitTimeSeconds` 屬性，為佇列上的所有訊息指定長輪詢。

  如需短輪詢與長輪詢的相關資訊，請參閱《*Amazon Simple Queue Service 開發人員指南*》中的[短輪詢和長輪詢](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html)。
+ 在訊息處理期間，您可以使用接收控點來變更訊息可見性逾時。如需如何執行此操作的詳細資訊，請參閱 [AmazonSQSClient](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/SQS/TSQSClient.html) 類別`ChangeMessageVisibilityAsync`的方法。
+ 無論可見性逾時設定為何，無條件呼叫 `DeleteMessageAsync`方法都會從佇列中移除訊息。