在异步回调中,回调线程不同于调用线程。使用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