繁体   English   中英

在C#中使用语句用法

[英]using statement usage in C#

我对使用声明有些怀疑:

我有一个叫做的课

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

我的代码:

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

public string FormatResuls(JobResuts results)
{
}

我的第一个问题是:在这种情况下,使用块是MyJob和MyJob.Results处理或只有MyJob和NOT MyJob.Results?

我也在C#中执行wrt任务的并行处理:

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#。 多谢你们!

是MyJob和MyJob.Results处理或只有MyJob和NOT MyJob.Results?

这对于Dispose方法的实现是主观的。 由于我们在您的问题中没有看到它,我将假设您当前没有在MyJob.Dispose处理您的Result属性,因此它将是后者。

由于只有MyJob包含在using语句中,并且再次假设它对Result属性没有任何作用,因此它将被处理而不是Results ,而Results不包含在using语句中。

您可以决定MyJob ,因为它封装了您的Result属性,也负责它的一次性使用。 如果您这样做,可以在MyJobs.Dispose处理Results

在处理任务中的异常时,确保正确处理对象的正确方法是什么?

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

只处理MyJobs。 对于其他属性,您需要了解对象所有权:拥有该对象的人应负责(通常)处置它。 实现IDisposable的属性可以被其他实例使用,因此如果您是创建它的人并且没有其它引用,则只能处置它,或者如果知道它已经被处理掉,则该类会正常失败。

这里有很多好的答案,但还有一件事。 如果您想确保您的对象被正确处理,因为它使用非托管资源,您应该在对象中实现析构函数,例如:

class MyJob : IDisposable 
{
     private bool _disposed = false;
     protected virtual void Dispose(bool disposing)
     {
          if (!_disposed)
          {
              //Dispose unmanaged resources and any child disposables here
          }
     }

     void Dispose()
     {
          this.Dispose(true);
          GC.SuppressFinalize(this);
     }

     ~MyJob()
     {
          //ONLY use if you have unmanaged resources that DO NOT
          //implement their own finalizers.
          Dispose();
     }
}

但是,建议您不要使用终结器(析构函数),除非您要使用不包含其自身终结器的非托管资源来最终确定类型。

有关实现IDisposable的最佳实践,请参阅https://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

1)最好的方法是在MyJob的Dispose()方法中部署JobResults 否则它不会自行处理

2)我将实现finally部分,遍历每个对象并进行处理。 但在大多数情况下,你多纳特需要做的是阅读

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM