簡體   English   中英

System.ObjectDisposedException: '無法解析實例,並且無法從此 LifetimeScope 創建嵌套生命周期

[英]System.ObjectDisposedException: 'Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope

我有一個異步控制器,我試圖從中調用兩個不同的異步函數。 像這樣

   public async void Approvefiles(string[] data)
    {

       var response = await _mediator.Send(new persons.Query(data));
       await _mediator.Send(new employees.Query(data));

    }

對我來說一切都很好,但這會引發錯誤

System.ObjectDisposedException: 'Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.'

誰能指出我在這里做錯了什么? 如果我只調用一個異步函數(僅適用於 person.Query),則不會發生此錯誤。

你的問題在這里:

 public async void Approvefiles(string[] data)

async void方法幾乎意味着在繼續之前沒有任何東西會等待該方法完成(以及導致許多其他問題)。

所以我想你的請求范圍在你的第二個_mediator.Send調用之前被清理了,這意味着什么都無法解決。

您需要將簽名更改為:

public async Task Approvefiles(string[] data)

然后根據需要在控制器中等待該方法,以確保它在您的請求結束之前完成。

這里有一個關於為什么 async void 不好的答案,更多細節。

我的兩分錢。 我的是一個小錯誤,我忘了等待異步調用。

所以我有這個異步擴展方法如下。

public static async Task<T> DeserializePostInMeWurkFormat<T>(this HttpClient httpClient, string route, HttpContent? content)
{
  var postResult = await httpClient.PostAsync(route, content);
  postResult.EnsureSuccessStatusCode();
  postResult.IsSuccessStatusCode.Should().BeTrue();
  var stringResponse = await postResult.Content.ReadAsStringAsync();
  var response = stringResponse.DeserializeWithCamelCasePolicy<T>();
  return response!;
}

我沒有等待就打電話如下。

var postsResult = _client.DeserializePostInMeWurkFormat<CompanyOnboardDto>(OnboardCompanyRequest.Route, data);

得到如下異常。

System.ObjectDisposedException HResult=0x80131622 Message=無法解析實例,並且無法從此 LifetimeScope 創建嵌套生命周期,因為它(或其父范圍之一)已被釋放。 來源=Autofac

使用 await 更正了如下調用,現在它可以正常工作了。

var postsResult = await _client.DeserializePostInMeWurkFormat<CompanyOnboardDto>(OnboardCompanyRequest.Route, data);

暫無
暫無

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

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