考慮以下代碼:
using var form = new MultipartFormDataContent();
if (uploadFile)
{
using var fileStream = file.OpenReadStream();
using var fileContent = new StreamContent(fileStream);
form.Add(fileContent, "Upload", fileName);
}
using var otherContent = new StringContent(someJson);
form.Add(otherContent,"Other");
await HttpClient.PostAsync("myApi", form);
我在這里有一個網路表單,我只想uploadFile
在true
.
但是,原樣的代碼將引發例外:
System.ObjectDisposedException: Cannot access a disposed object
這是因為我在塊內有fileStream
and fileContent
withusing
陳述句。if
然而,這些物件會過早地被釋放,即使它們被添加到的表單稍后取決于它們。
如果我不使用該using
陳述句,這些物件可能無法正確處理,編譯也會發出警告。
在不撰寫重復代碼的情況下處理這種情況的最佳方法是什么?
uj5u.com熱心網友回復:
您正在處理MultipartFormDataContent
過早需要的物件。理想情況下,它的檔案說明(或應該說明)給定的物件將被擁有并且將被適當地處置,一旦表單也被處置。
所以這不是IF的錯。
換句話說,不要using
在他們的宣告中使用關鍵字。處理它們不是你的作業,除非MultipartFormDataContent
's 的檔案有說明。
如果它說您必須處理它們,請執行以下操作:
using var form = new MultipartFormDataContent();
Stream fileStream = null;
StreamContent fileContent = null;
if (uploadFile)
{
fileStream = file.OpenReadStream();
fileContent = new StreamContent(fileStream);
form.Add(fileContent, "Upload", fileName);
}
try
{
using var otherContent = new StringContent(someJson);
form.Add(otherContent,"Other");
await HttpClient.PostAsync("myApi", form);
}
finally
{
fileContent?.Dispose();
fileStream?.Dispose();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527203.html