在异步回调中,回调线程不同于调用线程。使用Windows窗体或wpf时,这是一个问题,因为Windows窗体和wpf控件绑定到一个线程上。对于每个控件,都只能从创建该

控件的线程中调用方法。也就是说,如果有一个后台线程,就不能直接在这个线程中访问UI控件。

在Windows窗体控件中,唯一可以从非创建线程中调用的方法是Invoke(),BeginInvoke(),EndInvoke()和属性InvokeRequird。BeginInvoke和EndInvoke是Invoke的异步版本

           //Parallel.For
           int count =AttendanceExpandList.Count / 3;
            Parallel.For(0, 4, i =>
            {
                IList<AttendanceExpand> list = AttendanceExpandList.Skip(i * count).Take(count).ToList();
                list = AttenadaceCalculate(list);
            });


//Parallel.ForEach
            Parallel.ForEach(AttendanceExpandList, item =>
            {
                AttenadaceCalculate(item);
            });
//第三种方法
IsBusy = true;
            Stopwatch sw = new Stopwatch();
            sw.Start();

            int groupCount = AttendanceExpandList.Count / GROUPSIZE + 1;
            Task[] tasks = new Task[groupCount];
            for (int i = 0; i < groupCount; i++)
            {
                tasks[i] = Task.Factory.StartNew(o =>
                {
                    int index = (int)o;
                    int from = index * GROUPSIZE;
                    var list = AttendanceExpandList.Skip(from).Take(GROUPSIZE).ToList();
                    foreach (var a in list)
                    {
                        AttenadaceCalculate(a);
                    }

                }, i);
            }
            
        Task.Factory.ContinueWhenAll(tasks, t =>
            {
                sw.Stop();
                Debug.WriteLine("calc time used: " + sw.ElapsedMilliseconds / 1000.0);
                IsBusy = false;
            });

 详细内容可看http://www.cnblogs.com/x-xk/archive/2012/12/11/2804563.html

posted on 2014-01-03 21:00  梁娜  阅读(232)  评论(0编辑  收藏  举报