首页 / C# / 什么是在序列中运行C#任务的有效方法
什么是在序列中运行C#任务的有效方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了什么是在序列中运行C#任务的有效方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1907字,纯文字阅读大概需要3分钟。
内容图文
![什么是在序列中运行C#任务的有效方法](/upload/InfoBanner/zyjiaocheng/791/ded83b1f1a7843408a22e05750f07659.jpg)
我正在尝试找到一种方法来安排任务按顺序运行.我到目前为止提出的解决方案发布在下面,但我怀疑它可以以更容易/更有效的方式完成.
public class SequentialTaskRunner
{
private ISet<Task> runningTasks = new HashSet<Task>();
public void Run(Task task)
{
lock (runningTasks)
{
var tasksToAwait = runningTasks.ToArray();
// create a task that waits for the currently running tasks
var waitingTask = Task.Factory.StartNew(() =>
{
Task.WaitAll(tasksToAwait);
});
// make sure the task gets removed from the running tasks on completion
task.ContinueWith((antecedent2) =>
{
lock (runningTasks)
{
runningTasks.Remove(task);
}
});
// prepend the waiting task
waitingTask.ContinueWith((antecedent) => task.Start());
runningTasks.Add(task);
}
}
}
我想用它来排队处理com-port连接的任务,以防止它们以彼此的方式进入.
情况如下:我正在使用rfid设备.有两个司机在场. 1用于读/写.另一个可以根据请求扫描可用的COM端口以查找(其他)阅读器.有时,将使用阅读器驱动程序完成端口扫描,以恢复连接.正是这些2’端口扫描’任务我不想共同发生.
我希望这可以澄清我是如何陷入想要两个不同时运行的任务的.现在,可能还有另一条出路,避免回答这个问题.但我仍然很好奇,一个好的解决方案是什么:)
解决方法:
(完整的上一篇文章每次评论).
我的新理解是你有3种类型的任务.
>读者
>作家
>端口扫描仪
你希望这三者尽可能并行,但是你也喜欢Reader,如果它选择跳转到端口扫描重新连接,那么在端口扫描器处于活动状态时不会这样做.解决这种情况的一种方法是使用Semaphore.信号量控制对有限数量资源的访问.
在您的情况下,您可以使用有限数量(实际上只有1个)的资源(“端口扫描”).在这种情况下,我们可以选择使用更简单的AutoResetEvent.但是,我觉得信号量实际上可以减少混淆.
// Only 1 task may port scan at a time
Semaphore portScanResource = new Semaphore(initialCount: 1, maximumCount: 1);
// ...
// "Reader task"
var task = Task.Factory.StartNew( () =>
{
// ...
if (shouldPortScan)
{
portScanResource.WaitOne();
try
{
// do your port scan
}
finally
{
// we're done
portScanResource.Release();
}
}
});
端口扫描程序任务将使用相同的信号量,确保一次只有1个线程执行端口扫描.
内容总结
以上是互联网集市为您收集整理的什么是在序列中运行C#任务的有效方法全部内容,希望文章能够帮你解决什么是在序列中运行C#任务的有效方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。