[英]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.