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

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

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

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

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

实现:

 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. animation中的steps()逐帧动画

    在我们平时做宽高确定,需要背景图片切换的效果时,我如果用的是一张大的png图片.而且恰好是所有小图都是从左向右排列的,那么 我们只需测量出某一个小图距左侧有多少像素(x),然后我们banckgroun ...

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

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

  3. 成功启动了Apache却没有启动apache服务器

    原因没有用管理员身份运行...

  4. github使用入门 之GIT GUI Windows版

    申明下是原创. 这二天网上也看了不少关于github使用的文章,github对代码管理也开始用起来了.这篇给github新手看,大牛们请跳过. github说白了就是版本管理库,最常用的就是程序代码管 ...

  5. 涂抹Oracle—Flashback

    11.1  基于flashback查询过去的数据 a.基于时间的查询(as of timestamp) 构造表falsh_tbl,删除数据然后查询 SQL>select * from flash ...

  6. 两段小PYTHON,作啥用的,行内人才懂~~~:(

    哎,作也不是,不作也不是.... 下次有更新文件时,直接刷新一次了. #coding: UTF-8 import sys reload(sys) sys.setdefaultencoding( &qu ...

  7. Activity和Servlet的相似之处和区别

    相似之处:1.Activity.Servlet的职责都是向用户呈现界面.2.开发者开发Activity.Servlet都继承系统的基类.3.Activity.Servlet开发出来之后都需要进行配置. ...

  8. HDOJ 1395 2^x mod n = 1

    Problem Description Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1. Input ...

  9. 【翻译】五步快速使用LINQPad尝鲜StreamInsight

    StreamInsight  学习地址:http://www.cnblogs.com/StreamInsight/archive/2011/10/26/StreamInsight-Query-Seri ...

  10. PHP中数组转换为XML格式

    最近公司要做一个API接口,输出格式要有JSON与XML格式, 在PHP中,输入JSON直接json_encode就可以,但输出XML没有提供函数,于是决定自己写一个. <?php /** * ...