Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF核心调用EntityState.Modified,然后生成异步http请求处理数据库上下文_C#_Dependency Injection_.net Core_Ef Core 2.1 - Fatal编程技术网

C# EF核心调用EntityState.Modified,然后生成异步http请求处理数据库上下文

C# EF核心调用EntityState.Modified,然后生成异步http请求处理数据库上下文,c#,dependency-injection,.net-core,ef-core-2.1,C#,Dependency Injection,.net Core,Ef Core 2.1,引起问题的代码 var cats= await _animaldb.Cats.ToListAsync<Cats>(); foreach (var kitty in cats) { kitty.LastReq = DateTime.Now; kitty.DailyReqCount = cats.DailyReqCount + 1; // make HTTP request here to some endpoint async var data = await _restOps

引起问题的代码

var cats= await _animaldb.Cats.ToListAsync<Cats>();

foreach (var kitty in cats)
{
 kitty.LastReq = DateTime.Now;
 kitty.DailyReqCount = cats.DailyReqCount + 1;
// make HTTP request here to some endpoint async
 var data = await _restOps.GetJsonAsync("url");
// perhaps thread is being disposed ?
_animaldb.Entry(kitty).State = EntityState.Modified;// err 2nd iteration 
}

_animaldb.SaveChanges();
注意:我在for循环中使用db context/修改并保存条目ok,代码前面

编辑:我没有说我正在做一个异步http请求对不起

TL;博士

这个问题似乎与正在处理的线程有关,我可以使用非异步http req,如果可能的话,我希望能够保持这种方式,因为http请求需要一段时间才能完成


感谢您的关注,有什么想法吗?

删除GetRndUserAgent()中的usings语句,这是在处理数据库上下文

    using (_animaldb)
    {
        userAgent = await _animaldb.UserAgents.FindAsync(id);

    }

您是否尝试过删除
var data=wait_restOps.GetJsonAsync(“url”)从代码到测试它是否工作?嗨,是的,我已经检查过了,它工作得很好,没有异步http req,粘贴整个控制器没有多大意义,因为它后面有一层或两层,我将添加所有DI&构造函数和http调用方法。该死,我刚刚发现了错误,将等待一点人回答。因为回答你自己的问题并不有趣!这是怎么一回事?您使异步方法同步了吗?否,它是在结束时使用的,它处理了数据库上下文
public class RestOps
{
    private readonly ILogger<RestOps> _logger;
    private readonly Animaldb _animaldb;

    public RestOps(ILogger<RestOps> logger, Animaldb animaldb)
    {
        _logger = logger;
        _animaldb= animaldb;

    }

    public async Task<string> GetJsonAsync(string url, bool randomUserAgent = false)
    {
        var httpClientHandler = new HttpClientHandler();
        var client = new HttpClient(httpClientHandler);
        client.Timeout = TimeSpan.FromMilliseconds(3000);
        UserAgents userAgent = await GetRndUserAgent();
        var userAgentStr = string.Empty;

        var resultUserAgent = randomUserAgent ? userAgentStr = userAgent.Name : userAgentStr = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36";
        client.DefaultRequestHeaders.Add("User-Agent", resultUserAgent);
        // Make a list of web addresses.  
        // GetAsync returns a Task<HttpResponseMessage>. 
        string content = null;
        try
        {
            HttpResponseMessage response = await client.GetAsync(url);
            // Retrieve the website contents from the HttpResponseMessage.  
            content = await response.Content.ReadAsStringAsync();
        }
        catch (Exception ex)
        {

            content = "Failed to get:" + url;
        }
        return content;
    }

    private async Task<UserAgents> GetRndUserAgent()
    {
        UserAgents userAgent = null;
        Random r = new Random();
        var id = r.Next(0, 40);
        using (_animaldb)
        {
            userAgent = await _animaldb.UserAgents.FindAsync(id);

        }
        return userAgent;
    }
}
Cannot access a disposed object. A common cause of this error is disposing a 
context that was resolved from dependency injection and then later trying to 
use the same context instance elsewhere in your application. This may occur 
if you are calling Dispose() on the context, or wrapping the context in a 
using statement. If you are using dependency injection, you should let the 
dependency injection container take care of disposing context instances
    using (_animaldb)
    {
        userAgent = await _animaldb.UserAgents.FindAsync(id);

    }