我有一个任务来执行HttpWebRequest使用
Task<WebResponse>.Factory.FromAsync(req.BeginGetRespone, req.EndGetResponse)
Run Code Online (Sandbox Code Playgroud)
这显然可能会失败WebException.对于调用者我想返回一个Task<HttpResult>where HttpResult辅助类型来封装响应(或不是).在这种情况下,4xx或5xx响应也不例外.
因此,我在请求任务中附加了两个延续.一个与TaskContinuationOptions OnlyOnRanToCompletion另一个OnlyOnOnFaulted.然后将整个事物包裹Task<HttpResult>起来以获取一个结果,无论哪个继续完成.
使用该AttachedToParent选项创建三个子任务(请求加两个延续)中的每一个.
但是当调用者等待返回的外部任务时,AggregateException抛出的是请求失败.
我想,在故障延续中,观察WebException所以客户端代码只能查看结果.添加一个Waiton on fault continuation抛出,但是试一试这个并没有帮助.也不看Exception属性(如节"五合一例外通过使用Task.Exception属性"暗示在这里).
我可以安装一个UnobservedTaskException事件处理程序来过滤,但由于事件没有提供与故障任务的直接链接,这可能会在应用程序的这一部分之外进行交互,并且是一个大锤破解的例子.
鉴于出现故障的情况,Task<T>有没有办法将其标记为"故障处理"?
简化代码:
public static Task<HttpResult> Start(Uri url) {
var webReq = BuildHttpWebRequest(url);
var result = new HttpResult();
var taskOuter = Task<HttpResult>.Factory.StartNew(() => {
var tRequest = Task<WebResponse>.Factory.FromAsync(
webReq.BeginGetResponse,
webReq.EndGetResponse,
null, TaskCreationOptions.AttachedToParent);
var tError = tRequest.ContinueWith<HttpResult>( …Run Code Online (Sandbox Code Playgroud) 目前,我有一段代码需要对各种数据提供者进行大约7次Web服务调用.每次调用都需要几秒钟才能执行,所以我想并行运行它们以加快速度.
我将7个调用包装在Parallel.Invoke中,它可以同时运行几个东西,但在2核心服务器上,它一次只执行2个,每个核心一个.由于我正在做的就是等待Web服务调用返回,我希望它能够获取所有7并等待它们返回.
有没有办法做到这一点?或许我的方法错了?也许我需要创建对Web服务的异步调用?但那么如何等待他们全部回来再继续前进?
你可以猜到Parallel.For()循环的索引从一个值跳转到另一个值.我如何估算完成的工作量?
谢谢.
我要求将Web服务请求发送到在线api,我认为Parallel Extensions非常适合我的需求.
有问题的Web服务被设计为重复调用,但是如果您每秒超过一定数量的呼叫,则有一种机制可以向您收费.我显然希望尽量减少我的收费,因此想知道是否有人看过可以应对以下要求的TaskScheduler:
人们是否觉得这些是任务调度员应该处理的那种责任,还是我在咆哮错误的树?如果您有其他选择,我愿意接受建议.
我必须在某处做错事,因为我在我的concurrentbag中得到了重复的项目,这里是事件链
var listings = new ConcurrentBag<JSonListing>();
Parallel.ForEach(Types, ParallelOptions, (type, state) =>
{
...
status = ProcessType(listings, status, type, state);
....
});
private GeocodeResults ProcessType(ConcurrentBag<JSonListing> listings, GeocodeResults status, XElement type, ParallelLoopState state)
{
....
AddListingsToList(results, type, listings);
....
}
private void AddListingsToList(dynamic results, XElement type, ConcurrentBag<JSonListing> listings)
{
var typeMustMatch = type.Attribute("TypeMustMatch").Value;
var typeID = Convert.ToInt32(type.Attribute("ID").Value);
foreach (var result in results.results)
{
var foundListing = listings.SingleOrDefault(x => x.ID == result.id);
if (foundListing != null)
{
var typeIDs = foundListing.TypeIDs.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
if …Run Code Online (Sandbox Code Playgroud) 是否有任何反对使用此CTP的建议?它不稳定吗?
我有四个级别的数据结构定义如下:
Dictionary<Type1, Dictionary<Type2, Dictionary<Type3, List<Type4>>>>
Run Code Online (Sandbox Code Playgroud)
整个事情被封装在一个同样保持线程安全的类中.目前它只是在读取/操作数据时锁定整个集合(读取比写入更常见).
我正在考虑更换Dictionarywith ConcurrentDictionary和Listwith ConcurrentBag(它的项目不必订购).
如果我这样做,我可以消除锁定并确保并发集合能够正常工作吗?
嗨,谢谢你的期待!
我有一项计算任务需要大量时间或并行计算.
具体来说,我需要循环遍历大约50个图像的列表,Base64对它们进行编码,然后计算每个新编码项目与包含大约2000个Base64字符串编码图像的XML文件中的值之间的Levenshtein距离,以便找到字符串.具有最小Lev的XML文件.与基准字符串的距离.
常规foreach循环工作,但速度太慢,所以我选择使用PLINQ来利用我的Core i7多核处理器:
Parallel.ForEach(candidates, item => findImage(total,currentWinner,benchmark,item));
Run Code Online (Sandbox Code Playgroud)
任务开始非常出色,高速奔跑,但后来我得到了一个"内存不足"的例外.
我正在使用C#,.NET 4,Forms App.
我如何调整我的PLINQ代码,以便我没有可用的内存耗尽?
这是调用PLINQ的方法foreach:
private void btnGo_Click(object sender, EventArgs e)
{
XDocument doc = XDocument.Load(@"C:\Foo.xml");
var imagesNode = doc.Element("images").Elements("image"); //Each "image" node contains a Base64 encoded string.
string benchmark = tbData.Text; //A Base64 encoded string.
IEnumerable<XElement> candidates = imagesNode;
currentWinner = 1000000; //Set the "Current" low score to a million and bubble lower scores into it's place iteratively.
Parallel.ForEach(candidates, i => { …Run Code Online (Sandbox Code Playgroud) 我遍历一个连接字符串数组,并在每个循环中提取一些信息并添加到列表中.现在,我想使用并行库使其成为多线程,但我不确定该库是否保证对列表的写入是线程安全的,还是我需要使用锁定:
List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting =>
{
list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})
Run Code Online (Sandbox Code Playgroud) 我有一个异步方法,应该查找数据库条目。它按名称过滤,因此是并行执行的候选者。
但是,我找不到一种简单的方法来支持并行执行和异步任务。
这是我所拥有的:
private async Task<List<Item>> GetMatchingItems(string name) {
using (var entities = new Entities()) {
var items = from item in entities.Item.AsParallel()
where item.Name.Contains(name)
select item;
return await items.ToListAsync(); //complains "ParallelQuery<Item> does not contain a definition for ToListAsync..."
}
}
Run Code Online (Sandbox Code Playgroud)
当我删除它时AsParallel(),它将编译。AI 不应该同时使用这两个功能吗?还是我理解有问题?
IHMO,两者都有道理:
AsParallel()表示数据库查询可能会分成几个同时运行的子查询,因为任何项目的单独匹配都不依赖于任何其他项目。更新:这个例子中的坏主意,请参阅评论和答案!ToListAsync()将支持此方法的异步执行,以允许其他匹配方法(在其他数据上)立即开始执行。如何同时使用并行执行(使用 LINQ)和异步任务?