【发布时间】:2017-03-24 08:43:58
【问题描述】:
我有一个列表 lstSubscriptionRequests 我正在对哪些单独的项目进行某种异步处理。然后在处理完所有项目后,我必须返回更新的列表项目。我目前的实现是这样的
List<SubscriptionRequest> lstSubscriptionRequests = FromSomeResource();
var tsk = new List<Task>();
foreach (var oTsk in lstSubscriptionRequests.Select(objSubscriptionRequest => new Task(
() => ProcessSubscriptionForASingleRecord(objSubscriptionRequest))))
{
oTsk.Start();
lock (tsk)
{
tsk.Add(oTsk);
}
}
Task.WaitAll(tsk.ToArray());
所有任务完成后的某些项目似乎没有更新。 请让我知道我需要什么更正
【问题讨论】:
-
不要自己创建任务,使用
await或Task.Run。您的任务根本没有开始 -
你能帮我改正上面的代码吗?
-
你为什么要创建这样的冷任务,为什么你在主线程仍然时使用
lock?您的代码也不包含Parallel.ForEach,也不包含任何共享状态的尝试。不可能这样回答。例如Parallel.ForEach(lstSubscriptionRequests,ProcessSubscriptionForASingleRecord)等价于这段代码。你为什么不使用它?如果ProcessSubscription..产生结果使用PLINQ,例如from subscription in lstSubscriptionRequests.AsParallel() select ProcessSubscriptionForASingleRecord(subscription) -
请说明您想做什么,而不是您如何尝试。
-
我有一个 Parallel.For 每个我在其中开始任务。现在我把它删除了
标签: c# multithreading thread-safety task-parallel-library .net-4.5.2