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

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

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

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

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

实现:

 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. combobox只读代码

    public partial class Form1: Form { // combobox只读代码 [DllImport("user32.dll", CharSet = Char ...

  2. phpcms v9开源开发框架基础mvc解读

    根据对mvc的了解 简要写个mvc框架 也谈不上框架 希望对新手有帮助 简单的解析下mvc  你可以这样了解 m模型也就是数据库操作 v视图  c控制器 通过url来判断调用m和v来完成请求,本身没数 ...

  3. 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript

    本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...

  4. 一个用httpPost,get访问外网接口,参数json,返回json的示例

    package com.royal.util; import java.io.BufferedReader;import java.io.DataInputStream;import java.io. ...

  5. 2013第39周一Web打印

    2013第39周一Web打印 项目中遇到了Java Web打印问题,简单调用IE浏览器的打印不能完全满足要求,于是就搜集了Web打印相关的主题,简单汇总一下.web打印难点在分页.页面纸张设置,页眉页 ...

  6. android实现类似于支付宝余额快速闪动的效果

    效果如下:   此图片不会动,但实际上是会快速跳动的.  之前看到有支付宝的效果非常牛逼.就是进去看到余额呼噜噜的直接上蹿下跳到具体数字,效果帅,但不知道怎么实现,最近终于知道了. 思路: 首先经常用 ...

  7. jQuery/CSS3实现图片层叠展开特效

    这是一款基于jQuery和CSS3的图片层叠展开特效,让鼠标滑过图片时即可触发这些特效.其中有一款就像扇子展开收拢一样,看起来效果都非常不错.当然本文主要还是来分析一下用jQuery实现这一效果的方法 ...

  8. WinForm ListControl MouseWheel Envent

    最近在使用Listbox开发程序的时候, 遇到MouseWheel event 异常. 设置如下: 1. DrawModel:ownerDrawVariable. 2. InternalHeight: ...

  9. PCanywhere/teamviewer/RDP/ultraVNC/tigerVNC/realVNC/Xmanager

    PCanywhere/teamviewer/RDP/ultraVNC/tigerVNC/realVNC/Xmanager 1, 通常应用场景一般CentOS/RHEL等linux系统不配置安装Desk ...

  10. Linux+eclipse+gdb调试postgresql源码

    pg内核源码解析课上用的vs调试pg源码, VS用起来确实方便,但是配置调试环境着实有点麻烦.首先得装个windows系统,最好是xp,win7稍微麻烦点:最好使用vs05,08和10也可以,但是比0 ...