c# - 在C#中使用语句用法

我对using语句有一些疑问:

我有一个类

MyJob是一次性的。然后,我在MyJob JobResults上也有一个也是Disposable的属性。

我的代码:

using (MyJob job = new MyJob())
{
    //do something. 
     FormatResults(job.JobResults)
}

public string FormatResuls(JobResuts results)
{
}

我的第一个问题是:在这种情况下,在using块之后是同时处置MyJob和MyJob.Results还是仅处置MyJob而不是MyJob.Results?

我也在C#中使用w.r.t任务执行并行处理:
Tasks allTasks = List<Tasks>

try
{
   foreach(Task t in allTasks)
   {
         // Each tasks makes use of an IDisposable object.
        t.Start();
   }
    Task.WaitAll(allTasks);
}
catch(AggregateExecption aex)
{
    /// How do I ensure that all IDisposables are disposed properly if     an exception happens in any of the tasks?
}

我的第二个问题,在上面的代码中,当处理任务中的异常时,什么是确保正确处理对象的正确方法是什么?

对不起,如果我的问题太幼稚或令人困惑,因为我仍在尝试学习和理解C#。
谢谢你们!

最佳答案

are both MyJob and MyJob.Results disposed or only MyJob and NOT MyJob.Results?



这取决于 Dispose方法的实现。正如我们在您的问题中尚未看到的那样,我假设您当前没有在 Result中放置 MyJob.Dispose属性,因此它将是后者。

由于只有 MyJob包裹在 using语句中,并且再次假定它对 Result属性没有任何作用,因此将其与 Results相对,后者未包装在 using语句中。

您可以确定 MyJob(封装了 Result属性)也应负责处理该属性。如果您决定这样做,则可以将 Results放置在 MyJobs.Dispose中。

what is the proper way to ensure to dispose off objects correctly when handling exceptions in tasks?



如果传递给 Task的委托(delegate)包装在 using语句中,则是安全的,因为 using将您的代码转换为 try-finally块,如果 using块中发生异常,则 finally块仍将运行 yourObject.Dispose