亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多次運行函數時無法訪問已處置的對象

多次運行函數時無法訪問已處置的對象

C#
心有法竹 2022-10-15 15:21:39
我有一個 ASP.NET Core 2.1 應用程序,但出現錯誤:無法訪問已處置的對象。對象名稱:'Amazon.S3.AmazonS3Client'嘗試調用我的 AWS S3 讀取對象服務時。該服務第一次工作,第二次及以后失敗。我在 startup.cs 中有以下內容:services.AddSingleton<IAWSService, AWSService>();services.AddAWSService<IAmazonS3>();(我嘗試將 AsScoped() 配置為無效。)這是導致問題的功能:public class AWSService : IAWSService{    private readonly IAmazonS3 _s3Client;    public AWSService(IAmazonS3 s3Client)    {        _s3Client = s3Client;    }    public async Task<byte[]> ReadObjectFromS3Async(string bucketName, string keyName)    {        try        {            GetObjectRequest request = new GetObjectRequest            {                BucketName = bucketName,                Key = keyName            };            using (_s3Client)            {                MemoryStream ms = new MemoryStream();                using (var getObjectResponse = await _s3Client.GetObjectAsync(request))                {                    getObjectResponse.ResponseStream.CopyTo(ms);                }                var download = new FileContentResult(ms.ToArray(), "application/pdf");                return download.FileContents;            }        }        catch (AmazonS3Exception e)        {            Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);        }        catch (Exception e)        {            Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);        }        return null;    }}}我第一次運行該函數時,斷點顯示 this.s3client 未釋放,但隨后嘗試運行此函數顯示 s3client 已釋放,因此出現錯誤。
查看完整描述

4 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

那是因為您將_s3Client's 的用法包裝在一個using塊中,然后再處理該實例。

不要那樣做。

讓您的 IoC 容器為您處理,而不是顯式或隱式地處理您的_s3Client.

考慮到亞馬遜 .NET AWS SDK 的 AmazonS3 線程安全嗎?是是的”。這意味著您的應用程序AWSService在任何給定時間都有一個您的實例,并且該類將對IAmazonS3所有請求使用相同的實例。

然后您只需要在應用程序生命周期結束時處理它,您的 IoC 容器就會處理它。


查看完整回答
反對 回復 2022-10-15
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

Using 是調用 dispose 的 try/finally 塊的簡寫。



查看完整回答
反對 回復 2022-10-15
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

 using (_s3Client){} 

一旦 using阻塞完成執行,就會調用 dispose 方法


using 語句等于


  var ob = new Object()

 try

 {

   ob = null;

 }

 finally

 {

  if (ob!= null)

    ((IDisposable)ob).Dispose();

 }


查看完整回答
反對 回復 2022-10-15
?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

使用 _s3Client 刪除,當您將其保存在 using 塊中時,它會被處理掉。由于您的目標是重復使用它,所以不要丟棄,簡單。


using (var getObjectResponse = await _s3Client.GetObjectAsync(request))

using (MemoryStream ms = new MemoryStream())

{

    getObjectResponse.ResponseStream.CopyTo(ms);

    FileContentResult download = new FileContentResult(ms.ToArray(), "application/pdf");

    return download.FileContents;

}


查看完整回答
反對 回復 2022-10-15
  • 4 回答
  • 0 關注
  • 127 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號