需求:假设多个任务需要执行,每个任务不是一时半会能完成(需要能看到中间执行状况);

多个任务 根据条件不同 可能需要不同的处理

分析: 多线程并发执行多任务;

对任务进行管理,追踪中间执行状态;

运用策略模式抽象执行类;

实现:

 public enum TaskStatus
{
wait = ,
working = ,
stop = ,
suspend = ,
complete = ,
fail = ,
other =
}

TaskStatus

 public class Task
{
public TaskDelegate<ParaStatus> taskStatus;
public TaskDelegate<ParaInfo> taskInfo;
public TaskDelegate<ParaProcess> taskProcess; private TaskStatus _status = TaskStatus.wait;
private IExecuter _Executer { get; set; }
private Guid _taskId;
private Thread thread;
private string _name; public Task(Guid id, IExecuter Executer)
{
_taskId = id;
_Executer = Executer;
_Executer.TaskId = id;
_Executer.Task = this;
} public void Wait()
{
ChangeStatus(TaskStatus.wait);
} public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
} public Guid TaskId
{
get
{
return _taskId;
}
} public TaskStatus Status
{
get
{
return _status;
}
set
{
_status = value;
}
} public void Start()
{
if (thread == null)
{
thread = new Thread(_Executer.Do);
}
else if (thread.ThreadState == ThreadState.Stopped)
{
thread = new Thread(_Executer.Do);
}
thread.Start();
ChangeStatus(TaskStatus.working);
}
public void ChangeStatus(TaskStatus s)
{
Status = s;
ParaStatus ps = new ParaStatus(TaskId);
ps.Status = Status;
if (taskStatus != null) taskStatus(ps);
}
public void Stop()
{
if (thread != null)
{
if (thread.IsAlive)
{
try
{
thread.Abort();
}
catch { }
}
}
ChangeStatus(TaskStatus.stop);
}
public void Suspend()
{
try
{
thread.Suspend();
}
catch { }
ChangeStatus(TaskStatus.suspend);
}
public void Resume()
{
if (thread.IsAlive)
{
thread.Resume();
}
ChangeStatus(TaskStatus.working);
}
}

Task

  public interface IExecuter
{
Guid TaskId { get; set; } Task Task { get; set; }
void Do();
}

IExecuter

 public class Executer : IExecuter
{
public void Execute()
{ }
#region IExecute
public Guid TaskId { get; set; } public Task Task { get; set; } public void Do()
{
for (int i = ; i <= ; i++)
{
if (Task.taskProcess != null)
{
Thread.Sleep();
ParaProcess pp = new ParaProcess(TaskId);
pp.Rate = (double)i / ;
Task.taskProcess(pp);
}
}
if (Task.taskStatus != null)
{
Task.ChangeStatus(TaskStatus.complete);
}
}
#endregion
}

Executer

 public class TaskManager
{
public List<Task> Tasks = new List<Task>();
/// <summary>
/// 添加任务
/// </summary>
public Task AddTask(Task task)
{
try
{
Tasks.Add(task); task.Wait();
}
catch (Exception e)
{ }
return task;
}
public void StartTask(Task task)
{
task.Start();
}
/// <summary>
/// 停止任务
/// </summary>
/// <param name="downloader"></param>
public void StopTask(Task task)
{
task.Stop();
} public void SuspendTask(Task task)
{
task.Suspend();
} public void ResumeTask(Task task)
{
task.Resume();
} /// <summary>
/// 删除任务(自动终止未停止的任务)
/// </summary>
/// <param name="downloader"></param>
public void DeleteTask(Task task, bool deleteFile)
{
//先停止任务
task.Stop(); while (task.Status == TaskStatus.working)
{
Thread.Sleep();
} //从任务列表中删除任务
if (Tasks.Contains(task))
{
Tasks.Remove(task);
}
} }

TaskManager

  /// </summary>
/// <param name="para">泛型参数</param>
public delegate void TaskDelegate<T>(T para); /// <summary>
///
/// </summary>
public class ParaStatus
{
public ParaStatus(Guid task) { TaskId = task; }
public Guid TaskId { get; set; }
public TaskStatus Status { get; set; }
} public class ParaInfo
{
public ParaInfo(Guid task) { TaskId = task; }
public Guid TaskId { get; set; }
public string Info { get; set; }
} public class ParaProcess
{
public ParaProcess(Guid task) { TaskId = task; }
public Guid TaskId { get; set; }
public double Rate { get; set; }
}

TaskDelegate

demo 下载:demo

多线程、多任务管理 简单demo的更多相关文章

  1. WinForm多线程编程简单Demo

    需要搭建一个可以监控报告生成的CS(WinForm)工具,即CS不断Run,执行获取数据生成报告,经过研究和实践,选择了使用"WinForm多线程编程"的解决方案.当然参考了园中相 ...

  2. java多线程的简单demo

    模拟场景:顾客买车从车库中取车,厂家生产车,车存储在车库中.买家.厂家对同一个车库中的车操作 一.不加同步机制的代码如下: package com.joysuch.testng.thread; imp ...

  3. C#多线程最简单Demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 设计模式之单例模式的简单demo

    /* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...

  5. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  6. 使用Spring缓存的简单Demo

    使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...

  7. Managed DirectX中的DirectShow应用(简单Demo及源码)

    阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...

  8. angular实现了一个简单demo,angular-weibo-favorites

    前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...

  9. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步

    Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述     PV操作是对信号量进行的操作.     进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...

随机推荐

  1. sqoop 1.4.4-cdh5.1.2快速入门

    一.快速入门 (一)下载安装 1.下载并解压 wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.4-cdh5.1.2.tar.gz tar - ...

  2. HTTP状态码:400\500 错误代码

    一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码  说明100 ...

  3. 【结构型】Proxy模式

    代理模式是指为其他对象提供代理来控制对象的访问.这种手段有时候可以给我们带来许多好处.如:通过代理可以实现异步响应处理:通过代理可以起到保护或限制对象的使用的作用,从而提高安全性. 在设计上,用户使用 ...

  4. C程序设计语言练习题1-22

    练习1-22 编写一个程序,把较长的输入行”折“成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后.要保证程序能够智能地处理输入行很长以及在制定的列前没有空格或制表符时的情况. ...

  5. 利用libpcap抓取QQ号码信息

    最近想在QQ登录时把QQ号码信息记录下来,百度了很多都没有找到具体方式,最近用Wireshark分析报文+libpcap库嗅探实现了这个小功能. 通讯背景: QQ客户端在通讯时使用UDP协议,其中数据 ...

  6. 关于nginx架构探究(4)

    事件管理机制 Nginx是以事件驱动的,也就是说Nginx内部流程的向前推进基本都是靠各种事件的触发来驱动,否则Nginx将一直阻塞在函数epoll_wait()或suspend函数,Nginx事件一 ...

  7. Largest product in a series

    这个我开始理解错了,算错了. 我以为是求连续5个数的最大值,结果,是连接5个数相乘的最大值. 英语不好,容易吃亏啊. Find the greatest product of five consecu ...

  8. LeetCode _ Word Break

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  9. iOS 9之New UIKit for International User Interfaces

    金田 Apple一直是注重用户体验的典范,而此次在UI上面,更是做到极致.此次iOS 9的发布能完全支持阿拉伯语.希伯来语等书写和阅读方式为从右向左的语言环境.不仅仅是简单的基础文本,而是支持将界面翻 ...

  10. HDU_2034——集合A-B

    Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...