多线程、多任务管理 简单demo
需求:假设多个任务需要执行,每个任务不是一时半会能完成(需要能看到中间执行状况);
多个任务 根据条件不同 可能需要不同的处理
分析: 多线程并发执行多任务;
对任务进行管理,追踪中间执行状态;
运用策略模式抽象执行类;
实现:
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的更多相关文章
- WinForm多线程编程简单Demo
需要搭建一个可以监控报告生成的CS(WinForm)工具,即CS不断Run,执行获取数据生成报告,经过研究和实践,选择了使用"WinForm多线程编程"的解决方案.当然参考了园中相 ...
- java多线程的简单demo
模拟场景:顾客买车从车库中取车,厂家生产车,车存储在车库中.买家.厂家对同一个车库中的车操作 一.不加同步机制的代码如下: package com.joysuch.testng.thread; imp ...
- C#多线程最简单Demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- Spring的简单demo
---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...
- 使用Spring缓存的简单Demo
使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...
- Managed DirectX中的DirectShow应用(简单Demo及源码)
阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...
- angular实现了一个简单demo,angular-weibo-favorites
前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述 PV操作是对信号量进行的操作. 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...
随机推荐
- CentOS 7 之几个新特性(转)
上篇我们讲到默认没有ifconfig是centos7的新特性,所以我特意上网搜索了一下其新特性,找到一篇文章,现转过来. centos最小好化安装没有ifconfig命令 刚安装了centos7.0, ...
- 关于Jquery EasyUI中的DataGrid服务器端分页随记
一.关于DataGrid的分页和排序参数 对于分页参数不需要用户指定,程序在AJAX请求的时候会带上分页和排序需要的参数 每页显示条数:rows 当前页:page 排序字段:sort [multiS ...
- 最完美的匹配网页中图片 src 部分的正则表达式
$str='<p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"& ...
- 信息安全实验三:privilege-separation
title: privilege-separation date: 2016-01-12 14:40:04 categories: tags: --- Exercise1 In order to ga ...
- Ubuntu 查看和杀死进程[转]
今天在netbeans中关闭webrick时,发现没有关闭掉,打入localhost:3000 依然显示页面,发现无法从nb中再次关闭只有进入ubuntu的进程下关闭查看进程:1法,ps -e 命令 ...
- PHP 中的超全局变量
(1)$_GET[].一个包含所有PHP 从客户端浏览器接收的GET变量的数组. (2)$_POST[].一个包含所有PHP 从客户端浏览器接收的POST变量的数组. (3)$_COOKIE[].一个 ...
- 设计模式(十四):Command命令模式 -- 行为型模式
1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来 ...
- Codeforces Round #277.5 (Div. 2) --E. Hiking (01分数规划)
http://codeforces.com/contest/489/problem/E E. Hiking time limit per test 1 second memory limit per ...
- Java虚拟机内存优化实践
前面一篇文章介绍了Java虚拟机的体系结构和内存模型,既然提到内存,就不得不说到内存泄露.众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java ...
- hadoop2.2.0的WordCount程序
package com.my.hadoop.mapreduce.wordcount; import java.io.IOException; import org.apache.hadoop.conf ...