首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ManualResetEvent进行并行编程

用ManualResetEvent进行并行编程
EN

Stack Overflow用户
提问于 2016-09-05 12:53:22
回答 1查看 282关注 0票数 0

我有一个处理List<string>并行的方法。不幸的是,我不能使用.NET 4+。

但是当我运行这个方法时,i总是items.Count

代码语言:javascript
复制
public static void ParallelForEachTest(List<string> items)
{
    if (items != null && items.Count > 0)
    {
        List<ManualResetEvent> mEventList = new List<ManualResetEvent>();
        for (int i = 0; i < items.Count ; i++)
        {
            ManualResetEvent mEvent = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem((y) =>
            {
                Console.WriteLine(items[i] + i);
                mEvent.Set();
            });
            mEventList.Add(mEvent);
        }
        mEventList.ForEach(x => x.WaitOne());
    }
}

我需要改变什么才能实现

X 0 X 1 X 2

对于ParallelForEachTest(new List<string>(){"x","x","x"});

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-05 13:06:23

在执行Console.WriteLine时,循环已经结束,循环变量i有其最终值,等于list.Count

为了让每个任务打印其相应的索引,必须将索引值传递给任务本身:

代码语言:javascript
复制
ThreadPool.QueueUserWorkItem((y) => { ... }, i);

第二个参数是任务启动后将传递给回调的状态。

另外,确保不要使用闭包从任务内部访问状态。仅使用任务状态传输数据:

代码语言:javascript
复制
public static void ParallelForEachTest(List<string> items)
{
    if (items != null && items.Count > 0)
    {
        List<ManualResetEvent> mEventList = new List<ManualResetEvent>();
        for (int i = 0; i < items.Count; i++)
        {
            ManualResetEvent mEvent = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(
                (state) =>
                {
                    Tuple<string, int, ManualResetEvent> tuple =
                        (Tuple<string, int, ManualResetEvent>)state;
                    Console.WriteLine(tuple.Item1 + tuple.Item2);
                    tuple.Item3.Set();
                },
                Tuple.Create(items[i], i, mEvent));
            mEventList.Add(mEvent);
        }
        mEventList.ForEach(x => x.WaitOne());
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39331064

复制
相关文章

相似问题

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