簡體   English   中英

異步編程中如何使用await、async和Task

[英]How to use await, async and Task in asynchronous programming

這是我第一次編寫任何異步代碼。 我收到一個編譯錯誤,上面寫着:

無法將類型 void 隱式轉換為 int

而 function 正在返回一個int

public class Function
{
    IAmazonS3 s3client = new AmazonS3Client(RegionEndpoint.USEast1);
    public async Task<int> ListS3ObjectsAsync(string bucketName, IAmazonS3 client)
    {
        ListObjectsRequest request = new ListObjectsRequest();
        request.BucketName = bucketName;

        ListObjectsResponse response = await client.ListObjectsAsync(request);
        do
        {
            if (response.IsTruncated)
                request.Marker = response.NextMarker;
            else
                request = null;

        } while (request != null);

        var len = response.S3Objects.Count;
        return len;
    }

    public void FunctionHandler(S3Event evnt, ILambdaContext context)
    {
        // Here I'm getting the compile error
        int x = ListS3ObjectsAsync(evnt.Records?[0].S3.Bucket.Name, s3client).Wait();
    }
}

視覺工作室截圖:

Visual Studio 屏幕截圖

因為ListS3ObjectsAsync方法返回一個Task<int> ,這是獲取int的異步表示,所以為了獲得結果,您需要像這樣等待任務:

int x = await ListS3ObjectsAsync

但這將要求您也使 FunctionHandler 異步。

或者你可以在這樣的任務上調用.Result

var task = ListS3ObjectsAsync

int x = task.Result

請注意,這是一個阻塞操作,混合異步和非異步代碼是不好的做法。

.Wait方法只等待任務完成,不返回Result

不應該阻塞async代碼,因此最好的解決方案是使用await而不是Wait

public void FunctionHandler(S3Event evnt, ILambdaContext context)
{
  int x = await ListS3ObjectsAsync(evnt.Records?[0].S3.Bucket.Name, s3client);
}

然后編譯器將告訴您解決方案的下一部分:必須將FunctionHandler設為async ,並將其返回類型更改為Task ,即:

public async Task FunctionHandlerAsync(S3Event evnt, ILambdaContext context)
{
  int x = await ListS3ObjectsAsync(evnt.Records?[0].S3.Bucket.Name, s3client);
}

像這樣async的“增長”是正常的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM