小编dst*_*str的帖子

在WindowsForm中添加和删除控件和内存使用情况

我有一个带有面板控件的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调用的文章都非常不鼓励使用它.即使我没有任何自定义终结器/析构器,我也不确定是否使用它.

.net user-controls dispose memory-management winforms

2
推荐指数
1
解决办法
2944
查看次数

将float转换为字符串并获取精确值

这是我关于将字符串转换为float的最后一个问题的后续跟进

我有这个值存储在一个浮点变量:33.9112625(它是三十三)我需要将它转换为字符串并获得确切的值,但我无法这样做.float.ToString(CultureInfo.InvariantCulture)给了我"33.91126"的结果.我试过.ToString("G"),"G7"和CultureInfo.InvariantCulture.NumberFormat,但他们没有帮助.如何将float转换为字符串并获得完全相同的值?

.net string floating-point

2
推荐指数
2
解决办法
2164
查看次数

OpenIdConnect 中间件不断向请求添加“配置文件”范围

我正在努力弄清楚 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)

oauth-2.0 asp.net-core-mvc openid-connect identityserver4

2
推荐指数
1
解决办法
1842
查看次数

如何查询匿名类型集合?

如何查询使用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]'.

我该怎么办?

linq anonymous-types linq-to-sql

0
推荐指数
1
解决办法
2361
查看次数

通过同步进行异步的可能方法

我有一个 ASP.NET API,它公开了一些数据库操作。DB API 本身是同步的并且无法更改。我知道在 ASP.NET 中使用 Task.Run 是一个坏主意,我本来打算使 Web API 同步,但开始考虑使数据库操作异步的不同可能方法,并想知道其中是否有一个好主意。

  1. 使用Task.FromResult
[HttpGet]
public async Task<Result> Get()
{
      return Task.FromResult(DBOperation());
}
Run Code Online (Sandbox Code Playgroud)

感觉Task除了结果之外,只有分配才是好的。

  1. 使用ValueTask
return new ValueTask<Result>(DBOperation());
Run Code Online (Sandbox Code Playgroud)

感觉和任务一样(只是分配更多)?不确定 ValueTask 是 struct 会更好还是更差。

  1. 使用TaskCompletionSource
public Task<Result> DBOperation()
{
    TaskCompletionSource<Result> tcs = new TaskCompletionSource<Result>();
    //db call
    tcs.SetResult(<result>);
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

不确定是否有帮助。

  1. 使用Task.Yield
public Task<Result> DBOperation()
{
    await Task.Yield();
    //db call
}
Run Code Online (Sandbox Code Playgroud)

或许?

你怎么认为?

.net c# asynchronous async-await asp.net-core

0
推荐指数
1
解决办法
1098
查看次数