bool disposed为了ObjectDisposedException在所有主要暴露方法的开头有条件地抛出一个线程安全类型,有没有必要跟踪经典字段?
我已经在网上的几个地方看到了这种模式,但我不确定作者是否正确使用它,所以这个问题假定它们是.
在这种情况下,似乎disposed除了条件评估之外确保条件为真的唯一方法是在每个公开成员的整个主体上使用诸如lock()之类的同步机制,包括Dispose(bool)方法.难道这不会使类型再次有效地单线程吗?
如果这是真的,那么使用它就没有意义了,因此你不能在某些IDisposable实现中依赖ObjectDisposedException机制 - 那么为什么我们不采用这种机制,如果没有必要呢?
====
我猜IDisposable和ObjectDisposedException只是不一起用于线程安全类型.
在一个实现的类中IDisposable,什么时候检查对象是否已被处理并且ObjectDisposedException如果它已经被丢弃是合理的?在所有公共方法和属性中(除外Dispose)?有时?决不?
我一直在调试这个程序没有任何结果,不幸的是我无法看到问题的根源.我得到了这个异常:ObjectContext实例已被释放,不能再用于需要连接的操作.
有2个表: - CustomerSet - OrderSet
Orders表中名为Customer_id的字段可确保表之间的关系,并且Orders表中还有一个名为Customer的虚拟导航属性.
方案如下:我在Orders表中插入一个元素:
Order order = new Order();
Order.order_id = GenerateId(IdType.Order);
Order.date = DateTime.Now;
Order.Customer_id = GetCustomerId(tbCustomerName.Text);
Insert(order);
Run Code Online (Sandbox Code Playgroud)
在Insert方法中,在using语句中有DBContext,因此它在需要时自动处理.我在这里工作.
之后,我需要来自先前插入元素的数据(例如,我需要Customer字段的一些属性).现在我希望Customer领域有价值:
Order o = GetOrder(order.order_id);
Run Code Online (Sandbox Code Playgroud)
我在Customer字段中得到了一个例外:o.Customer抛出了'System.ObjectDisposedException'类型的异常
我正在玩懒惰的装载,打开或关闭它,但我没有锻炼.情况是一样的......
我该弄什么?
真正的好处在于,如果我一步一步地使用F11,它通常可以正常工作!
请帮忙!先感谢您.
对你们所有问题.
在我的公司,我们正在开发一个在微软MVC框架内运行的应用程序.我们正在实现的控制器类继承自MVC基类Controller.例:
public class MyController: Controller
{
protected bool IsDisposed { get; set; }
… various methods…
}
Run Code Online (Sandbox Code Playgroud)
我们在团队中进行的讨论围绕Dispose()模式.本质上,这涉及实现IDisposable接口,最好是根据Microsoft认可的模式.
请参阅此链接:http://msdn.microsoft.com/en-us/library/fs2xkftw%28v=vs.110%29.aspx
有趣的是,我们的控制器类不拥有任何管理或管理的资源.因此,Dispose(bool)的实现大大简化:
protected override void Dispose(bool disposing)
{
IsDisposed = true;
base.Dispose(disposing);
}
Run Code Online (Sandbox Code Playgroud)
关于IsDisposed属性的使用(或需要)存在一些分歧,在以下方法中使用:
protected void ThrowIfDisposed()
{
if (IsDisposed) throw new ObjectDisposedException(“MyController”);
}
Run Code Online (Sandbox Code Playgroud)
然后在每个执行"实际"工作的方法的开头调用此方法.这里的想法是不应该再次使用被处置的对象,因此它应该抛出ObjectDisposedException.另一种意见是,既然Dispose(bool)"没有"(除了设置IsDisposed属性和调用Dispose(bool)基类),"处置"对象实际上并不处于无法使用的状态,因此没有理由抛出.因此,没有理由甚至实施Dispose(bool).
反对这一点的一个论点是MyController在处理它时会抛出并调用其中一个方法,因此在未来版本中应该添加托管和/或非托管资源时其行为不会改变.
反对这最后一点的论点是,MyController永远不应该在将来的版本中添加任何资源,而是应该在未来需要添加资源的情况下派生它.另一个问题是:为什么(库)类控制器没有实现ThrowIfDisposed()或类似的东西?
因此,总结一下,一个人想要实施Dispose(bool)并ThrowIfDisposed()如上所示,派系二认为他们是不必要的并且想要废除他们.
我看到这两个观点的优点,无法真正下定决心.意见?
我在Windows窗体程序中遇到了来自iTextSharp的HTMLWorker.Parse问题.每当我执行代码并从HTMLWorker.Parse开始时,它都会给出objectDisposedException.例外情况说它无法访问已关闭的文件.但我检查了很多次,找不到关闭的文件.这是代码:
class HtmlToPdfConverter
{
private iTextSharp.text.Document doc = new iTextSharp.text.Document();
public HtmlToPdfConverter()
{
this.doc.SetPageSize(PageSize.A4);
}
public string Run(string html, string pdfName)
{
try
{
using (doc)
{
StyleSheet styles = new StyleSheet();
using (PdfWriter writer = PdfWriter.GetInstance(this.doc, new FileStream(@"Z:\programs\" + pdfName + ".pdf", FileMode.Create)))
{
this.doc.Open();
this.doc.OpenDocument();
this.doc.NewPage();
if (this.doc.IsOpen() == true)
{
StringReader reader = new StringReader(html);
//XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, reader);
this.doc.Add(new Paragraph(" "));
HTMLWorker worker = new HTMLWorker(this.doc);
worker.Open();
worker.StartDocument();
worker.NewPage();
worker.Parse(reader);
worker.SetStyleSheet(styles);
List<IElement> ie = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(reader, null);
foreach …Run Code Online (Sandbox Code Playgroud) 我想了解vNext.
我编写了自定义UserStore,它与MongoDB一起使用并实现了这些接口:
public class UserStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser>, IUserSecurityStampStore<ApplicationUser>,
IUserLoginStore<ApplicationUser>, IUserClaimStore<ApplicationUser>, IUserEmailStore<ApplicationUser>, IUserRoleStore<ApplicationUser>,
IUserTwoFactorStore<ApplicationUser>
Run Code Online (Sandbox Code Playgroud)
在Startup.cs中添加:
app.UseServices(services =>
{
services.AddIdentity<ApplicationUser>()
.AddUserStore(() => { return new UserStore(); })
.AddUserManager<UserManager<ApplicationUser>>()
.AddHttpSignIn();
services.AddMvc();
});
Run Code Online (Sandbox Code Playgroud)
然后尝试使用Visual Studio模板中未更改的AccountController并遇到麻烦.
登录时,在UserStore.FindByNameAsync()中获取ObjectDisposedException - 称为UserStore.Dispose().
在github.com/aspnet上的UserManager代码中,Store.Dispose()仅在UserManager.Dispose()中调用.
我可以忽略Dispose的调用,一切正常,但这不是好方法.
所以我不知道该怎么做
PS问题是:什么(以及为什么)可以调用UserStore.Dispose()?
asp.net-mvc objectdisposedexception asp.net-identity asp.net-identity-3 asp.net-core
我正在尝试使用WebSockets在Web浏览器客户端和ASP.NET服务器之间进行通信.
我制作了一组不同大小的请求,每个请求之间经过了几秒钟的时间.三个第一个正确传递,但是精确的一个,没有特别是另一个,关闭WebSocket连接,在服务器端抛出异常.
此异常的错误消息和堆栈跟踪如下所示:
致命错误:无法访问已处置的对象.
对象名:'System.Web.WebSockets.AspNetWebSocket'.
在System.Web.WebSockets.AspNetWebSocket.ThrowIfDisposed()
在System.Web.WebSockets.AspNetWebSocket.SendAsyncImpl(ArraySegment 1个缓冲器,WebSocketMessageType为messageType,布尔endOfMessage,的CancellationToken的CancellationToken,布尔performValidation)
在System.Web.WebSockets.AspNetWebSocket.SendAsync(
在[我的代码路径这里...]的ArraySegment 1缓冲区,WebSocketMessageType messageType,Boolean endOfMessage,CancellationToken cancellationToken)
这可能是一个线程问题,因为我在使用async与websockets通信的函数的各处使用方法.
我知道这个代码(at socket.SendAsync)抛出了异常:
public class SocketTranslater
{
private WebSocket socket;
private JavaScriptSerializer serializer;
// [...]
private ArraySegment<byte> Encode(Object data)
{
string json = serializer.Serialize(data);
return (new ArraySegment<byte>(Encoding.UTF8.GetBytes(json)));
}
public async Task Send(Object packet)
{
ArraySegment<byte> encoded = this.Encode(packet);
await socket.SendAsync(encoded, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
Run Code Online (Sandbox Code Playgroud)
套接字是从另一个类创建的:
public class EventSender : IHttpHandler
{
private static List<SocketTranslater> socketTranslaters = new List<SocketTranslater>();
public void ProcessRequest(HttpContext context) …Run Code Online (Sandbox Code Playgroud) 考虑以下功能:
private int GetSomethingFromFile(FileStream fs)
{
using (BinaryReader br = new BinaryReader(fs))
{
fs.Seek(0, SeekOrigin.Begin);
return br.ReadInt32();
}
}
Run Code Online (Sandbox Code Playgroud)
FileStream对象作为参数传入,BinaryReader使用using语句声明.当我尝试使用该FileStream对象时,在调用此函数后,它会抛出System.ObjectDisposedException.为什么FileStream对象与BinaryReader对象一起被丢弃?
我有一个WCF客户端,我遇到了问题.
我不时会遇到这个例外:Cannot access a disposed object.这就是我打开连接的方式:
private static LeverateCrmServiceClient crm = null;
public static CrmServiceClient Get(string crmCertificateName)
{
if (crm != null)
{
crm.Close();
}
try
{
crm = new LeverateCrmServiceClient("CrmServiceEndpoint");
crm.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindBySubjectName,
crmCertificateName);
}
catch (Exception e)
{
log.Error("Cannot access CRM ", e);
throw;
}
return crm;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我每次都关闭并重新打开连接.您认为可能是什么问题?
堆:
System.ServiceModel.Security.MessageSecurityException: Message security verification failed. ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.ServiceModel.Security.SymmetricSecurityProtocol'.
at System.ServiceModel.Channels.CommunicationObject.ThrowIfClosedOrNotOpen()
at System.ServiceModel.Security.MessageSecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates)
--- …Run Code Online (Sandbox Code Playgroud) 我有一个.NET 4 C#控制台应用程序.它从我们的IBM i中提取数据并将其发送到我们的Internet SQL Server.它完美无缺,直到它结束,我得到以下错误:
System.ObjectDisposedException未处理Message =安全句柄已关闭Source = mscorlib ObjectName =""StackTrace:在System.Threading.RegisteredWaitHandleSafe.Finalize()处的System.Runtime.InteropServices.SafeHandle.DangerousRelease()处:InnerException:
我的程序代码是:
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Begin: " + DateTime.Now.ToString());
SystemCodeController sc = new SystemCodeController();
sc.SyncSystemCodes();
ParkingTicketController pt = new ParkingTicketController();
pt.SyncParkingTickets();
EmailHelper.SendSuccessEmail();
System.Console.WriteLine("End: " + DateTime.Now.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台中,我看到了开始时间和结束时间.所以我知道最后一行确实被执行了.我应该忘记或不做的是什么?
更新:Sync*方法将数据从IBM提取到对象中,然后使用实体框架将记录插入数据库.
public void SyncParkingTickets()
{
ptr.ClearTable();
ptr.InsertNewCitation(ibmI.GetAllCitations());
ptr.SaveChanges();
}
public void InsertNewCitation(IEnumerable<ParkingTicket> citations)
{
foreach (ParkingTicket citation in citations)
{
InsertNewCitation(citation);
}
}
public void InsertNewCitation(ParkingTicket citation)
{
db.AddToParkingTickets(citation);
}
public IEnumerable<ParkingTicket> GetAllCitations()
{ …Run Code Online (Sandbox Code Playgroud) c# ×8
dispose ×2
idisposable ×2
.net ×1
.net-4.0 ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
entity ×1
frameworks ×1
itextsharp ×1
wcf-client ×1
websocket ×1
winforms ×1