关于实体框架,有很长时间以来一直困扰着我.
去年我为使用EF的客户编写了一个大型应用程序.在开发过程中,一切都很顺利.
我们八月发货了.但几周后我开始在生产服务器上看到奇怪的内存泄漏.运行几天后,我的ASP.NET MVC 4进程占用了机器的所有资源(8 GB).这不好.我在网上搜索,看到你应该在一个using()块中包围所有的EF查询和操作,以便可以处理上下文.
在一天中,我重构了我要使用的所有代码using(),这解决了我的问题,因为这个过程依赖于稳定的内存使用.
我首先没有围绕我的查询的原因是我从Visualofite中包含的Microsofts自己的脚手架开始了我的第一个控制器和存储库,这些没有使用包围它的查询,而是它具有DbContext作为实例变量的控制器本身.
首先:如果处理上下文非常重要(某些事情不会很奇怪,dbconnection需要关闭等等),微软可能应该在他们的所有示例中都有这个!
现在,我已开始与我在我的后脑勺所有学习收获一个新的大项目工作,我一直在试用的.NET 4.5和EF 6的新功能async和await.EF 6.0具有所有这些异步方法(例如SaveChangesAsync,ToListAsync等等).
public Task<tblLanguage> Post(tblLanguage language)
{
using (var langRepo = new TblLanguageRepository(new Entities()))
{
return langRepo.Add(RequestOrganizationTypeEnum, language);
}
}
Run Code Online (Sandbox Code Playgroud)
在课堂上TblLanguageRepo:
public async Task<tblLanguage> Add(OrganizationTypeEnum requestOrganizationTypeEnum, tblLanguage language)
{
...
await Context.SaveChangesAsync();
return langaugeDb;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我现在在一个using()块中包含我的语句时,我得到异常DbContext was disposed,在查询能够返回之前.这是预期的行为.查询运行async,using块在查询之前完成.但是在使用ef 6的async和await函数时,我应该如何以适当的方式处理我的上下文?
请指出我正确的方向.
是using()需要EF 6?为什么微软自己的例子从未有过这样的特色?如何正确使用异步功能并处理上下文?
我最近下载了Visual Studio 2013,并在我正在处理的项目上运行了代码分析.它引发了一些我正在解决的问题,但其中一个特别是关于我如何使用"使用"IDisposable语句.
这是我的代码示例:
using (MemoryStream msDecrypt = new MemoryStream(encryptedText.ToBase64Byte()))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我理解分析警告试图告诉我以这种方式处理多个对象可能会导致对象处置问题.
我确信在上面的例子中处理一个对象不会抛出异常.那么我应该修改我的代码还是保持原样?
注意:我在Unity中使用C#,这意味着.NET 3.5版本,所以我不能使用await或async关键字..
当我在其中放入异步工作的方法时,使用语句会发生什么?
using (WebClient wc = new WebClient()) {
wc.DownloadFileAsync(urlUri, outputFile);
}
SomeMethod1();
SomeMethod2();
Run Code Online (Sandbox Code Playgroud)
如您所知,在DownloadFileAsync()调用该方法之后,SomeMethod1()将在仍在工作using时调用哪个是块外的.所以现在我真的很困惑在这种情况下using语句和异步方法会发生什么.DownloadFileAsync()
会Dispose()的wc,在没有任何问题的正确的时间叫什么名字?
如果没有,我该如何更正此示例?
我正在使用Visual Studio 2010来定位.NET 4.0 Client Profile.我有一个C#类来检测给定进程何时启动/终止.为此,该类使用ManagementEventWatcher,初始化如下; query,scope并且watcher是类字段:
query = new WqlEventQuery();
query.EventClassName = "__InstanceOperationEvent";
query.WithinInterval = new TimeSpan(0, 0, 1);
query.Condition = "TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'notepad.exe'";
scope = new ManagementScope(@"\\.\root\CIMV2");
watcher = new ManagementEventWatcher(scope, query);
watcher.EventArrived += WatcherEventArrived;
watcher.Start();
Run Code Online (Sandbox Code Playgroud)
事件EventArrived的处理程序如下所示:
private void WatcherEventArrived(object sender, EventArrivedEventArgs e)
{
string eventName;
var mbo = e.NewEvent;
eventName = mbo.ClassPath.ClassName;
mbo.Dispose();
if (eventName.CompareTo("__InstanceCreationEvent") == 0)
{
Console.WriteLine("Started");
}
else if (eventName.CompareTo("__InstanceDeletionEvent") == 0)
{
Console.WriteLine("Terminated");
} …Run Code Online (Sandbox Code Playgroud) 更多的问题出于好奇而不是任何事情,但为什么C#为关键字定义了两个不同的"目的" using?一方面,它是一个指令......
用于为命名空间创建别名或导入在其他命名空间中定义的类型.
另一方面,这是一个......
定义一个范围,在该范围之外将放置一个或多个对象.
对我而言,对于相同的关键字似乎有不同的用途,但也许我错过了一些东西.这个关键字有两个不同的用途吗?或者,这两个目的,在编译器的腹部深处,真的是一样的东西?
可能重复:
使用包含多个变量的语句
我有几个一次性物品要管理.CA2000规则要求我在退出范围之前处置所有对象..Dispose()如果我可以使用using子句,我不喜欢使用该方法.在我的具体方法中,我应该在使用中写许多:
using (Person person = new Person()) {
using (Adress address = new Address()) {
// my code
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以另一种方式写这个:
using (Person person = new Person(); Adress address = new Address())
Run Code Online (Sandbox Code Playgroud) 该using语句是否始终处置该对象,即使有一个返回或异常被抛入其中?IE:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
Run Code Online (Sandbox Code Playgroud)
要么
using (var myClassInstance = new MyClass())
{
// ...
throw new UnexplainedAndAnnoyingException();
}
Run Code Online (Sandbox Code Playgroud) 考虑以下C++代码.
namespace A {
void f() { // first function
}
void f(int) { // second function
}
}
...
using A::f; // introduces both functions
Run Code Online (Sandbox Code Playgroud)
有没有办法只引入一个功能?
我对ASP.NET MVC应用程序中实体框架上下文的期望生命周期有一些疑问.是不是最好尽可能在最短的时间内保持上下文?
请考虑以下控制器操作:
public ActionResult Index()
{
IEnumerable<MyTable> model;
using (var context = new MyEntities())
{
model = context.MyTable;
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将不起作用,因为在视图呈现页面时,实体框架上下文已超出范围.其他人如何构建上面的代码?
我有一个方法,将FileStream作为输入.此方法在for循环内运行.
private void UploadFile(FileStream fileStream)
{
var stream = GetFileStream();
// do things with stream
}
Run Code Online (Sandbox Code Playgroud)
我有另一种方法,它创建并返回FileStream:
private FileStream GetFileStream()
{
using(FileStream fileStream = File.Open(myFile, FileMode.Open))
{
//Do something
return fileStream;
}
}
Run Code Online (Sandbox Code Playgroud)
现在第一个方法抛出一个ObjectDisposedException当我尝试访问返回的FileStream时,可能是因为它已经关闭,因为我正在使用" using"来正确处理流.
如果我不使用"using"而是按如下方式使用它,那么FileStream将保持打开状态,循环的下一次迭代(在同一文件上运行)会抛出异常,告知文件已在使用中:
private FileStream GetFileStream()
{
FileStream fileStream = File.Open(myFile, FileMode.Open);
//Do something
return fileStream;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用try-finally块,我在那里关闭流,finally那么它也会抛出ObjectDisposedException.
如何有效地返回文件流并关闭它?
using ×10
c# ×9
idisposable ×4
.net ×3
asynchronous ×2
.net-3.5 ×1
asp.net-mvc ×1
c++ ×1
dispose ×1
namespaces ×1
stream ×1
wmi ×1