c#-在asp .net中限制异步任务,对N个成功任务有限制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-在asp .net中限制异步任务,对N个成功任务有限制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1725字,纯文字阅读大概需要3分钟。
内容图文
![c#-在asp .net中限制异步任务,对N个成功任务有限制](/upload/InfoBanner/zyjiaocheng/679/221e87c72e024b5db7cf2aede3f7021d.jpg)
我正在使用Asp .Net 4.5.1.
我有要运行的任务,称为Web服务,有些可能会失败.我需要运行N个成功的任务,这些任务执行少量的CPU工作,并且主要调用Web服务,然后停止,我想节流.
例如,假设某个集合中有300个URL.我们需要运行一个名为Task< bool>的函数.每个节点上的CheckUrlAsync(url)具有节流功能,例如,意味着“同时”仅运行5个(换句话说,在任何给定时间最多使用5个连接).另外,我们只想执行N次(假设100次)成功的操作,然后停止.
我已经读过this和this,但仍然不确定什么是正确的方法.
你会怎么做?
>假设ASP .Net
>假定进行IO调用(对Web服务的http调用),无需大量CPU操作.
解决方法:
使用信号量苗条.
var semaphore = new SemaphoreSlim(5);
var tasks = urlCollection.Select(async url =>
{
await semaphore.WaitAsync();
try
{
return await CheckUrlAsync(url);
}
finally
{
semaphore.Release();
}
};
while(tasks.Where(t => t.Completed).Count() < 100)
{
await.Task.WhenAny(tasks);
}
虽然我更喜欢使用Rx.Net来生成一些更好的代码.
using(var semaphore = new SemaphoreSlim(5))
{
var results = urlCollection.ToObservable()
.Select(async url =>
{
await semaphore.WaitAsync();
try
{
return await CheckUrlAsync(url);
}
finally
{
semaphore.Release();
}
}).Take(100).ToList();
}
好吧…这将很有趣.
public static class SemaphoreHelper
{
public static Task<T> ContinueWith<T>(
this SemaphoreSlim semaphore,
Func<Task<T>> action)
var ret = semaphore.WaitAsync()
.ContinueWith(action);
ret.ContinueWith(_ => semaphore.Release(), TaskContinuationOptions.None);
return ret;
}
var semaphore = new SemaphoreSlim(5);
var results = urlCollection.Select(
url => semaphore.ContinueWith(() => CheckUrlAsync(url)).ToList();
我确实需要补充一点,该代码仍然可以运行所有300个URL,返回的速度更快…仅此而已.您需要将取消令牌添加到semaphore.WaitAsync(token)才能取消排队的工作.我再次建议为此使用Rx.Net.使用Rx.Net来获取与.Take(100)一起使用的取消令牌会更容易.
内容总结
以上是互联网集市为您收集整理的c#-在asp .net中限制异步任务,对N个成功任务有限制全部内容,希望文章能够帮你解决c#-在asp .net中限制异步任务,对N个成功任务有限制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。