现场保障系统开发过程中增加并行处理(一)
在现场保障系统开发中,考虑到从客户端获取webservice比较慢以及性能问题,打算采用多线程异步处理机制,希望能够增强用户体验,不至于在加载窗体的时候导致假死机现象.于是先实现了多线程的功能:
在业务层增加了专门处理多线程的类(AsyncHelper)
但是考虑到我们现在采用的框架是.net framework 4.0的版本,于是增加了并行处理机制.
并行处理机制使得我们更多的把重点放在业务上,我们没有象多线程那么单独抽取出来一个类然后再调用,而是分散在具体的业务中.
并行处理机制首先是需要考虑好怎么样划分这个并行处理的任务模块,如果划分的不好,那么相互间会有影响,性能反而下降.
并且并行处理本身就是多线程的,而且封装的更好.
一般如下进行操作:
首先是划分你的功能:
Action task1 = new Action(() =>
{
GetData1(Thread.CurrentThread.ManagedThreadId.ToString());
});
Action task2 = new Action(() =>
{
GetData2(Thread.CurrentThread.ManagedThreadId.ToString());
});
Action task3 = new Action(() =>
{
GetData3(Thread.CurrentThread.ManagedThreadId.ToString());
});
然后是调用
//这是第一种方式:
var tasks = new Action[] { () => task1(), () => task2(), () => task3() };
// System.Threading.Tasks.Parallel.Invoke - 并行调用多个任务
System.Threading.Tasks.Parallel.Invoke(tasks);
//这是第2种方式
Task task0 = new Task(() =>
{
Task.Factory.StartNew(() => task1());
Task.Factory.StartNew(() => task2());
Task.Factory.StartNew(() => task3());
});
task0.Start();
如果Task<T> task0 = new Task<T>()
那么 可以获取该task的返回值 task0.Result