【问题标题】:running tasks parallely in asp.net [closed]在asp.net中并行运行任务[关闭]
【发布时间】:2013-08-29 06:24:20
【问题描述】:

通过查看Divide Foreach into threads sample 中指定的此解决方案

我尝试用这段代码实现它:

foreach (Object vo in arrreclist)
{
    msg = String.Empty;
    objprocess.GetType().GetMethod("ProcessRecord").Invoke(objprocess, new Object[] { vo });

    status = (StatusInfo)objprocess.GetType().GetProperty("status").GetValue(objprocess, null);
    if (status.errcode != 0)
    {
        lngfailedcnt++;
        WriteErrorLog();
    }
    else
    {
        lngsuccesscnt++;
        lngInstanceSuccCount++;
    }
    lngcnt++;
    if ((lngcnt % 10) == 0)
    {

        if (instanceId == 0)
        {
            schldr.ModifyJobhistoryForUploadFileRecCnt(Runid, (int)lngTotreccnt, lngfailedcnt, (int)(lngfailedcnt + lngsuccesscnt));
        }
        else
        {
            schldr.ModifyJobhistoryForUploadFileRecCnt(Runid, 0, lngfailedcnt, (int)(lngfailedcnt + lngsuccesscnt));
        }
        status = schldr.status;
        if (status.errcode != 0)
        {
            if (!String.IsNullOrEmpty(Errorlogfile))
                WriteErrorLog();
            holdInstance = true;
            break;
        }
        //Get Job Status
        //If job was terminated then Update Batch and Job history with status as STOPPED
        intstatus = schedulersvc.GetJobStatus(Runid);
        status = schedulersvc.status;
        if (status.errcode != 0)
        {
            WriteErrorLog();
            holdInstance = true;
            break;
        }
        if (intstatus == 1) //STOPPED
        {
            holdInstance = true;
            break;
        }
        lngcnt = 0;
    }
}

break 语句出现错误消息:

不能离开匿名方法或 lambda 表达式的主体

我的主要任务是并行化以下行:

objprocess.GetType().GetMethod("ProcessRecord").Invoke(objprocess, new Object[] { vo }) 

但是其他的都是依赖,怎么实现呢?

【问题讨论】:

  • 首先你为什么要使用反射?相反,你为什么不定义一个接口并使用 Parallel.ForEach
  • 您的错误与您发布的代码不匹配:我在那里看不到任何 lambdas。
  • 另外,当您说您只想并行化该行时,这是否意味着循环的其余部分不能并行运行?
  • @svick 我没有在帖子中发布并行化代码,还考虑使用 parallel.foreach 使上述代码并行运行,但不支持数组列表,我认为状态不是线程安全的在循环中获取 objprocess 的状态,所以可能是另一种方式,然后上线,因为该特定行调用了一个需要更多时间的方法,所以我想并行运行它

标签: c# asp.net multithreading parallel.foreach


【解决方案1】:

首先,并行化在 ASP.NET 中通常没有意义。如果您有很多用户访问您的网站,您通常更关心可扩展性(您可以同时服务多少用户),而不是单个用户的原始性能。

如果您不是这种情况,并行化可能对您有意义。

其次,您会收到该错误,因为Parallel.ForEach() 不是循环(就语言而言)。并且 break 退出 lambda 没有任何意义。

要突破Parallel.ForEach(),您可以使用ParallelLoopState.Break()ParallelLoopState.Stop()(阅读文档以了解您真正想要哪一个)。为此,您将需要使用 Parallel.ForEach() 的重载,从而为您提供 ParallelLoopState

第三,Parallel.ForEach() 不支持ArrayList 有一个很好的理由:因为你永远不应该使用它。如果您真的想要objects 的列表,请使用List<object> 明确表示您确实不知道该类型。如果您不能(或不想)更改ArrayList,可以使用.Cast<object>() 使Parallel.ForEach()(以及与IEnumerable<T> 一起使用的其他方法)接受它。

第四,我认为仅并行化 ProcessRecord 没有意义。看起来status 返回了最后一个ProcessRecord 的状态。如果你并行执行ProcessRecord,那么就不再清楚哪个是最后一个了。

另外,您不应该认为某些方法不是线程安全的。你应该知道。如果你并行化你不知道是线程安全的东西,你以后可能很难调试错误。

第五,如果您只想并行化循环的第一部分,我认为最好的选择是 PLINQ。比如:

var intermediateResults = source.AsParallel().Select(x => Process(x));

foreach (var intermediateResult in intermediateResults)
{
    // the rest of the loop
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2021-07-09
    • 2017-09-26
    相关资源
    最近更新 更多