更新
添加TaskCreationOptions.LongRunning解决了这个问题,但这是一个好方法吗?如果没有,那么克服此异常的最佳解决方案是什么?
我正在尝试排查问题。我已经实现了StackOverFlow中提供的建议,但这些建议没有帮助解决问题。我通过附加扩展方法使用了其他替代方法,如ContinuwWith选项而不是Task.WaitAll。这也没有帮助。
我已经放了Ex.handle {}并且我在异常中尝试了在Catch(aggrgateException ex)中抛出ex,但这并没有帮助捕获实际的异常。
我只安装了.Net 4.0,所以我无法尝试.Net 4.5分辨率来解决这个问题
我一直在获得的例外是
“System.AggregateException:”通过等待任务或访问Exception属性未观察到任务的异常“
在此之后,它只会杀死工作进程,应用程序崩溃,我在EventViewer中看到一个条目
这里的任何帮助将不胜感激。
我们有以下代码:
public Static Class Extensions
{
public static void LogExceptions(this Task<List<<MyBusinessObject>> task)
{
task.ContinueWith(t =>
{
var aggException = t.Exception.Flatten();
foreach (var exception in aggException.InnerExceptions)
{
AddToLogFile("Task Exception: " + exception.Message);
}
},
TaskContinuationOptions.OnlyOnFaulted);
}
}
//In a different class call the extension method after starting the new tasks
Task<List<MyBusinessObject>>[] tasks = new Task<List<MyBusinessObject>>[MyCollection.Count];
for (int i = 0; i < MyCollection.Count; i++)
{
MyDTO dto = new MyDTO();
--Some Property Assignment for the MyDTO object--
tasks[i] = Task<List<MyBusinessObject>>.Factory.StartNew(MyDelegate, dto).LogExceptions()
}
docker run -it [public dockerhub name]
答案 0 :(得分:0)
我不是一次为每个迭代创建一个新任务,而是每次都为100个任务创建新任务。然后我等待所有任务完成并再完成100个任务,直到所有任务完成
int count = Mycollection.Count(); 任务&gt; []任务;
int i = 0;
int j;
while (i < count)
{
j = 0;
tasks = new Task<List<MyBusinessObject>>[nbrOfTasks];
foreach (var p in Mycollection.Skip(i).Take(nbrOfTasks))
{
MyRequestDto dto = new MyRequestDto ();
--Some Proerty Assignment
tasks[j] = Task<List<MyBusinessObject>>.Factory.StartNew(MyDelegate, dto);
i++;
j++;
}
try
{
// Wait for all the tasks to finish.
if (tasks != null && tasks.Count() > 0)
{
tasks = tasks.Where(t => t != null).ToArray();
Task.WaitAll(tasks);
}
}
catch (AggregateException e)
{
}
这与可用于维护多个任务的内存有关。如果所需的RAM无法在此过程中为并发任务提供服务,那么应用程序就会崩溃。这就是为什么最好生成有限的任务。而不是吐出多个并将其留给线程池进行管理。