我有一个带有面板控件的WindowsForm,我用它来显示我的UserControls.我这样添加控件:
private void AddControl(Control control)
{
panel.Controls.Clear();
control.Size = new Size(panel.Width - 1, panel.Height - 1);
control.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles. Top;
panel.Controls.Add(control);
}
..
AddControl(new ucSomeControl());
Run Code Online (Sandbox Code Playgroud)
我只是单击了使用AddControl()的每个按钮,并且每次都看到内存使用量增加.我让应用程序运行,什么都不做,一个半小时,内存使用量从140mb减少到138mb,就像2mbs一样.你认为这是正常的还是我在控制添加方法上做错了什么我应该/可以改进以减少内存使用?
我已经创建了我的应用程序的4个版本:Debug,Release,with Dispose,with manuel GC call.
用我的原始代码
在内存使用方面,如5mb,我的应用程序的调试版本和发布版本之间几乎没有什么区别.这些版本的问题是我点击按钮越多,即使我点击相同的按钮并再次创建相同的UserControl,内存使用量也会同样增加.
随着Dispose
我添加了Chris Arnold的Dispose代码.内存使用率显着降低,虽然创建越来越多的控件仍然会增加内存使用量,但现在每个控件使用的内存要少得多.这是一个有价值的附录.
随着manuel GC通话
我在Dispose之后添加了这段代码:
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
答对了!内存使用量甚至比Dispose代码少.最好的部分是,即使我一遍又一遍地创建新的控件,内存使用量的增加也非常小,几乎是微不足道的.
我真的很喜欢使用Dispose + GC方法,但是每篇关于manuel GC调用的文章都非常不鼓励使用它.即使我没有任何自定义终结器/析构器,我也不确定是否使用它.
这是我关于将字符串转换为float的最后一个问题的后续跟进
我有这个值存储在一个浮点变量:33.9112625(它是三十三)我需要将它转换为字符串并获得确切的值,但我无法这样做.float.ToString(CultureInfo.InvariantCulture)给了我"33.91126"的结果.我试过.ToString("G"),"G7"和CultureInfo.InvariantCulture.NumberFormat,但他们没有帮助.如何将float转换为字符串并获得完全相同的值?
我正在努力弄清楚 OAuth2.0、OIDC1.0 和 IdentityServer4。我已经设置了一个测试 MVC Core 客户端,仅openid请求“”范围。但不知何故,OpenIdConnnect 中间件不断将“ profile”范围添加到请求的范围中。" profile" 是强制范围吗?我应该启用它吗?或者我在这里做错了什么?我将不胜感激任何意见。
IdSrv资源:
_identityResources = new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResource
{
Name = "test_user",
UserClaims = new[] { "test_user.email" }
}
};
_apiResources = new List<ApiResource>
{
new ApiResource
{
Name = "test_api",
Scopes =
{
new Scope()
{
Name = "test_api.account.create",
UserClaims = new[] { "test_api.account.create" }
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
IdSrv客户端配置:
new Client
{
ClientId = "client.mvcx",
ClientName = "MVC Core Client",
AllowedGrantTypes …Run Code Online (Sandbox Code Playgroud) 如何查询使用select new?填充/创建的集合?
我有这个BindingSource:
this.bindingSource.DataSource =
from row in db.Table
select new
{
name = row.Name + row.Num.ToString()
};
Run Code Online (Sandbox Code Playgroud)
我想像查询其他BindingSources一样查询它:
var query = from row in (IEnumerable<Table>)anotherBindingSource.List
where row.name == "asd"
select row;
Run Code Online (Sandbox Code Playgroud)
由于bindingSource包含匿名类型,我收到此错误:
无法将类型为'System.Data.Linq.SortableBindingList
1[<>f__AnonymousType815 等的对象强制转换为'System.Collections.Generic.IEnumerable`1 [Table]'.
我该怎么办?
我有一个 ASP.NET API,它公开了一些数据库操作。DB API 本身是同步的并且无法更改。我知道在 ASP.NET 中使用 Task.Run 是一个坏主意,我本来打算使 Web API 同步,但开始考虑使数据库操作异步的不同可能方法,并想知道其中是否有一个好主意。
Task.FromResult[HttpGet]
public async Task<Result> Get()
{
return Task.FromResult(DBOperation());
}
Run Code Online (Sandbox Code Playgroud)
感觉Task除了结果之外,只有分配才是好的。
ValueTaskreturn new ValueTask<Result>(DBOperation());
Run Code Online (Sandbox Code Playgroud)
感觉和任务一样(只是分配更多)?不确定 ValueTask 是 struct 会更好还是更差。
TaskCompletionSourcepublic Task<Result> DBOperation()
{
TaskCompletionSource<Result> tcs = new TaskCompletionSource<Result>();
//db call
tcs.SetResult(<result>);
return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)
不确定是否有帮助。
Task.Yieldpublic Task<Result> DBOperation()
{
await Task.Yield();
//db call
}
Run Code Online (Sandbox Code Playgroud)
或许?
你怎么认为?
.net ×3
asp.net-core ×1
async-await ×1
asynchronous ×1
c# ×1
dispose ×1
linq ×1
linq-to-sql ×1
oauth-2.0 ×1
string ×1
winforms ×1