首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步任务来划分工作负载

异步任务来划分工作负载
EN

Stack Overflow用户
提问于 2013-09-03 01:39:01
回答 1查看 987关注 0票数 1

我试图根据id范围将工作划分到多个任务中,有一个基于i的开始和结束范围的方法,我可以看到GetRanges方法正在正确地将范围划分为任务。但是,当任务被称为StartWork(startRange,endRange)时,它有时设置所有任务的相同范围,有时设置2或3个重复范围。当异步任务启动时,基本上是唯一的startrange和endRange没有被传递?我怎样才能修好它?

代码语言:javascript
复制
        int endRange = 0;
        int startRange = 0;
        int total = GetTotal();
        int startIndex =1;
        for (int i = 0; i < taskCount; i++)
        {
            GetRanges(ref startRange, ref endRange, total, i, startIndex);             
            Console.WriteLine("startRange {0} EndRange {1}", startRange, endRange);             
            tasks[i] = Task.Factory.StartNew(() => StartWork(startRange, endRange));

        }

        private void StartWork(int startRange, int endRange)
        {
            Console.WriteLine("Thread {0}  task startRange {1} EndRange {2}", System.Threading.Thread.CurrentThread.ManagedThreadId, startRange, endRange);
        }

        private void GetRanges(ref int startRange, ref int endRange, int total, int threadIndex, int startIndex)
        {
            int averagetask = (total - startIndex) / taskCount;
            startRange = (averagetask * threadIndex) + 1;

            if (threadIndex == taskCount - 1)
            endRange = total;
            else
            endRange = averagetask * (threadIndex + 1);

        }

这是输出startRange 1 EndRange 785761 startRange 785762 EndRange 1571522 startRange 1571523 EndRange 2357283 startRange 2357284 EndRange 3143047

线程3任务startRange 2357284 EndRange 3143047线程5任务startRange 2357284 EndRange 3143047线程4任务startRange 2357284 EndRange 3143047线程6任务startRange 2357284 EndRange 3143047

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-03 02:52:40

小心使用ref参数并将它们传递给不同线程上的任务。我认为,当任务查看值时,它已经在另一个线程上被更改了。ie您的StartWork方法正在查看startRange/endRange的当前值,该值一直在被更改。

尝试这样做:

代码语言:javascript
复制
for (int i = 0; i < taskCount; i++)
{
    GetRanges(ref startRange, ref endRange, total, i, startIndex);             
    Console.WriteLine("startRange {0} EndRange {1}", startRange, endRange);             
    var tempStartRange = startRange;
    var tempEndRange = endRange;
    tasks[i] = Task.Factory.StartNew(() => StartWork(tempStartRange, tempEndRange));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18582852

复制
相关文章

相似问题

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