首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大容量后控器asp核1.1

大容量后控器asp核1.1
EN

Stack Overflow用户
提问于 2017-11-05 12:52:00
回答 2查看 88关注 0票数 0

我需要一个邮递员来处理很多交通--我做过这样的事情

代码语言:javascript
复制
    [HttpPost]
    public async Task<IActionResult> Post([FromBody] List<VdoPlayInfo> lv)
    {
        var seesionID = HttpContext.Session.GetString("sessionId");
        var vdoID = HttpContext.Session.GetInt32("videoid");
        var tasks = new Task[lv.Count];
        for (int i = 0; i < lv.Count; i++)
        {
            tasks[i] = Task.Run(() => _ADB.SaveLogView(lv[i]);                    
        }
        await Task.WhenAll(tasks);
        return Ok();          
    }

经过几秒钟的工作,我得到了这个错误

代码语言:javascript
复制
System.ArgumentOutOfRangeException: 'Index was out of range. 
Must be non-negative and less than the size of the collection.'

即使是lv.Count = 2,我的i指数也达到了5。有什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-06 04:59:55

目前还不清楚你最终想要做什么,但是如果你的目标是高性能,这是实现这一目标的绝对错误的方式。Task.Run将在每次调用它时从池中提取一个新线程,因此在列表中有两个项时,您的操作现在正在消耗三个线程(一个用于请求,一个用于每个列表项)。显然,随着列表项的扩展,您的线程使用情况也是如此,因此您将极大地降低服务器的潜在吞吐量,并且最终可能会导致线程饥饿。

还不清楚_ADB.SaveLogView在做什么,但是如果它执行同步工作,您需要意识到使用Task.Run并不能使它异步。同步仍然是同步,您只是阻塞另一个线程而不是请求线程。但是,由于您正在等待任务完成,请求线程仍然被阻塞,因此实际上除了浪费一堆可能处理其他请求的线程之外,您并没有达到其他目的。

如果_ADB.SaveLogView是异步的(在这种情况下,您应该将其命名为_ADB.SaveLogViewAsync以避免混淆),那么只需执行以下操作就可以简化代码(避免浪费线程):

代码语言:javascript
复制
var tasks = new Task[lv.Count];
for (int i = 0; i < lv.Count; i++)
{
    tasks[i] = _ADB.SaveLogViewAsync(lv[i]);                    
}

因为在这个场景中,它应该已经返回了一个Task,所以不需要将它包装在另一个Task中。

但是,理想情况下,您实际上应该以事务方式处理这个问题。如果在保存其中一个实体时出现问题,其他实体仍然会被保存。如果需要重新提交以保存失败的实体,则会导致问题。同样,还不清楚该方法在做什么,但是使用类似于Entity的方法,您只需将每个新实体添加到DbSet (这将标记为在更改跟踪中创建它们),然后只调用SaveChangesAsync一次,它将尝试将所有项保存在一个事务中的一次运行中,因此,如果有任何失败,所有内容都会回滚。

如果您使用的是实体框架( Entity )或其他支持幕后事务的系统,则应该使用该功能。如果您正在执行某种类型的手动数据库工作,那么您应该提交您自己的事务。

票数 0
EN

Stack Overflow用户

发布于 2017-11-05 13:40:43

你能试试这个吗?

代码语言:javascript
复制
for (int i = 0; i < lv.Count; i++)
    {
        var item = lv[i];
        tasks[i] = Task.Run(() => _ADB.SaveLogView(item);                    
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47121771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档