c# taskscheduler使用场合_hbase shell put

c# taskscheduler使用场合_hbase shell put这里记录下TaskScheduler的简单用法。使用场景:在使用Task的时候,大家都知道用TaskFactory.StartNew可以用来创建一个Task。这里如果创建10个,那么这10个Task就各自放飞直接运行了。一般情况下是没什么大问题,如果这10个中的每个Task非常耗CPU或者内存,而公司的产品又是非常考验配置成本(比如一体机,移动设备等),就需要让这10个Task按照一定要求执行,比如串行执行,从而节省资源、让机器还可以顺畅去干别的事情。Task…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

这里记录下 TaskScheduler 的简单用法。

使用场景:

      使用 Task 的时候,大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个,那么这3个 Task 就各自放飞直接运行了。

class Program
{
	private static TaskFactory _taskFactory;
	static void Main(string[] args)
	{
		_taskFactory = new TaskFactory();

		_taskFactory.StartNew(Func1);
		_taskFactory.StartNew(Func2);
		_taskFactory.StartNew(Func3);

		Console.ReadLine();
	}

	static void Func1()
	{
		Thread.Sleep(3000);
		Console.WriteLine("Func1");
	}
	static void Func2()
	{
		Thread.Sleep(2000);
		Console.WriteLine("Func2");
	}
	static void Func3()
	{
		Thread.Sleep(1000);
		Console.WriteLine("Func3");
	}
}

结果:

Func3

Func2

Func1

一般情况下没什么大问题,但如果这3个中的每个Task都非常耗CPU或者内存,而计算机又需要预留资源去干别的事情,这就要让3个Task不能同时执行。又或者确实要让某些Task先做,有些后做。这就需要我们自己能够决定Task执行顺序。

怎样达到这样的效果?

答案就是:TaskScheduler,它可以让已经创建好的 Task 去按照特殊的顺序来执行。

就拿上面的场景来举例:

为了节约系统资源,我要让这3个Task单独执行,有一个在执行,其它俩就不能执行。最简单的就是串行执行,这样只需要写一个类继承TaskScheduler:

public class MyTaskScheduler : TaskScheduler, IDisposable
{
	private static readonly object _mutex = new object();
	public readonly List<Task> _currentTasks = new List<Task>();
	private readonly ManualResetEvent[] _schedulerEvents = new ManualResetEvent[2];
	public override int MaximumConcurrencyLevel => 1;

	public MyTaskScheduler()
	{
		_schedulerEvents[0] = new ManualResetEvent(false);
		_schedulerEvents[1] = new ManualResetEvent(false);

		var executionThread = new Thread(ExecutionThread) { Name = "MyThread" };
		executionThread.SetApartmentState(ApartmentState.MTA);
		executionThread.IsBackground = true;
		executionThread.Priority = ThreadPriority.Normal;
		executionThread.Start(null);
	}

	public void Dispose()
	{
		_schedulerEvents[1].Set();
	}

	private void ExecutionThread(object args)
	{
		try
		{

			while (true)
			{
				if (!WaitIfEmpty())
				{
					break;
				}

				Task task;
				lock (_mutex)
				{
					task = _currentTasks[0];
				}

				try
				{
					TryExecuteTask(task);
				}
				catch (Exception)
				{
					throw;
				}
				finally
				{
					TryDequeue(task);
				}
			}
		}
		finally
		{
			//todo
		}
	}
	private bool WaitIfEmpty()
	{
		lock (_mutex)
		{
			if (_currentTasks.Count == 0)
			{
				//pause task
				_schedulerEvents[0].Reset();
			}
		}

		//wait any signal.
		int id = WaitHandle.WaitAny(_schedulerEvents);

		// id is item index of _schedulerEvents
		return id == 0;
	}

	protected override IEnumerable<Task>? GetScheduledTasks()
	{
		lock (_mutex)
		{
			return _currentTasks.ToArray();
		}
	}
	protected override void QueueTask(Task task)
	{
		lock (_mutex)
		{
			_currentTasks.Add(task);

			if (_currentTasks.Count > 0)
			{
				// Start task
				_schedulerEvents[0].Set();
			}
		}
	}
	protected sealed override bool TryDequeue(Task task)
	{
		lock (_mutex)
		{
			var res = _currentTasks.Remove(task);
			return res;
		}
	}
	protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
	{
		return false;
	}
}

主函数中只要稍作修改:

static void Main(string[] args)
{
	var taskScheduler = new MyTaskScheduler();
	_taskFactory = new TaskFactory(taskScheduler);

	_taskFactory.StartNew(Func1);
	_taskFactory.StartNew(Func2);
	_taskFactory.StartNew(Func3);

	Console.ReadLine();
}

运行结果:

Func1

Func2

Func3

在MyTaskScheduler 中,我建了一个线程 executionThread,线程方法是一个while循环,一直在监听有没有新的Task过来,有多个Task过来,就按Task创建顺序执行,没有的话 while 就暂停在 waitany 处。

这样的场景,配合 ManualResetEvent 和Task的CancellationTokenSource 非常适合做 带有暂停和取消功能的任务列表。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183039.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 谷歌的技术_探究GNSS技术在

    谷歌的技术_探究GNSS技术在文章目录引言TrueTime事务读写事务快照读只读事务总结引言Spanner是一个全球分布式的数据库,从数据模型来看Spanner很像BigTable,都是类似于key对应着一行数据,但是却并不一样,Spanner中衍生出了“目录”的概念(把两张表合并存储)。这并不是重点,Spanner的重是它是第一个在全球范围内传递数据且保证外部一致的分布式事务的系统,且支持几种特定的事务,这显然是一个很困难的问题,我们会在文章中加以描述,这篇文章主要对Spanner的事务以及实现事务所使用的TrueTimeAP

    2025年6月2日
    3
  • n皇后问题-回溯法求解[通俗易懂]

    n皇后问题-回溯法求解[通俗易懂]n皇后问题-回溯法求解1.算法描述在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。n皇后是由八皇后问题演变而来的。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76…

    2022年9月30日
    3
  • linux下安装composer以及使用composer安装laravel

    linux下安装composer以及使用composer安装laravel

    2021年10月26日
    44
  • PWM原理 PWM频率与占空比详解

    PWM原理 PWM频率与占空比详解什么是PWM​脉冲宽度调制(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。​]…

    2022年6月25日
    26
  • Linux 查看java进程的命令

    Linux 查看java进程的命令刚才去了微众税银面试。面试官赶时间,导致我的语速也快了起来,其中有个问题没答上,那就是Linux下查看java进程的命令。回来做个记录,以防还有公司问到(之前工作上遇到Linux还是太少了(;´д`)ゞ,服)。Linux下查看和停止所有java进程在Linux下查看所有java进程命令:ps-ef|grepjava停止所有java进程命令:pkill-9java停止特…

    2022年8月24日
    11
  • 苹果备忘录导出到android,怎么把苹果的备忘录转到安卓系统?[通俗易懂]

    苹果备忘录导出到android,怎么把苹果的备忘录转到安卓系统?[通俗易懂]原标题:怎么把苹果的备忘录转到安卓系统?我的闺蜜小张之前一直使用的是苹果手机,她使用过苹果6s和iPhone8plus,不过最近这次在更换手机的时候,小张为了支持国产手机,就入手了一款华为手机。在试用了一两天的新华为手机后,小张表示这款华为手机也是比较好用的,于是小张就想把之前的苹果手机备忘录内容转到安卓系统中以便继续使用。彩色便签不过小张发现苹果自带备忘录内容是不支持授权一键导出所有数据的,这…

    2022年5月9日
    182

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号