小编vas*_*ski的帖子

使用c#中的多个键优化缓存 - 删除对象的重复

我在Asp.Net Core中有一个项目.这个项目有一个ICacheService如下:

public interface ICacheService
{
    T Get<T>(string key);
    T Get<T>(string key, Func<T> getdata);
    Task<T> Get<T>(string key, Func<Task<T>> getdata); 
    void AddOrUpdate(string key, object value);
} 
Run Code Online (Sandbox Code Playgroud)

实现只是基于ConcurrentDictionary<string, object>,所以它并不复杂,只是存储和检索这个字典中的数据.在我的一项服务中,我有一个方法如下:

public async Task<List<LanguageInfoModel>> GetLanguagesAsync(string frontendId, string languageId, string accessId) 
{
    async Task<List<LanguageInfoModel>> GetLanguageInfoModel()
    {
        var data = await _commonServiceProxy.GetLanguages(frontendId, languageId, accessId);
        return data;
    }

    _scheduler.ScheduleAsync($"{CacheKeys.Jobs.LanguagesJob}_{frontendId}_{languageId}_{accessId}", async () =>
    {
        _cacheService.AddOrUpdate($"{CacheKeys.Languages}_{frontendId}_{languageId}_{accessId}", await GetLanguageInfoModel());
        return JobStatus.Success;
    }, TimeSpan.FromMinutes(5.0));

    return await _cacheService.Get($"{CacheKeys.Languages}_{frontendId}_{languageId}_{accessId}", async () => await GetLanguageInfoModel());
}
Run Code Online (Sandbox Code Playgroud)

问题是我在这个方法中有三个参数,我用它作为缓存键.这工作正常,但问题是三个参数的组合非常高,因此在缓存中将有如此多的对象重复.我正在考虑创建一个没有重复的缓存,如下所示:

使用列表作为键的缓存,我可以为一个对象存储多个键.因此,当我获得新元素时,如果它在缓存中,我将检查每个元素,如果它在缓存中,我将只在密钥列表中添加一个键,否则在缓存中插入一个新元素.这里的问题是测试对象是否在缓存中是一个大问题.我认为它将消耗大量资源,并且需要将一些序列化为特定形式以使比较成为可能,这将使得比较消耗大量资源.缓存可能看起来像这样CustomDictionary<List<string>, object>

有没有人知道解决这个问题的好方法是不重复缓存中的对象?

编辑1: …

c# caching asp.net-core

15
推荐指数
1
解决办法
1815
查看次数

当我在Visual Studio中生成具有2D数组作为参数的构造函数时,这些星号是什么?

在Visual Studio for Mac中,如果我写了这样的东西:

public class Foo {
    public int[,] Property1 { get; }

}
Run Code Online (Sandbox Code Playgroud)

将光标放在那里的空行,然后按Command + I生成构造函数:

在此输入图像描述

这发生了:

public class Foo {
    public int[,] Property1 { get; }
    public Foo(int[*, *] property1)
    {
        Property1 = property1;
    }
}
Run Code Online (Sandbox Code Playgroud)

生成构造函数,但参数类型的类型是int[*, *],不编译.

在此输入图像描述

我在想这是Visual Studio提示我写一些东西来代替那些星号,或者不是吗?因为单维数组不会发生这种情况,而且我不知道C#中的任何语法允许你把东西[]放在像这样的地方.

对于三维数组,它会生成3个星号:

public Foo(int[*, *, *] property1)
{
    Property1 = property1;
}
Run Code Online (Sandbox Code Playgroud)

是什么导致Visual Studio执行此操作?

我的Visual Studio版本是:Visual Studio for Mac社区7.2.2(版本11).

我试图在Windows版本的Visual Studio - Visual Studio Community 2015上测试这个.但是我找不到一个按钮来执行此操作.根据这个答案,也就是在"快速行动"一生成构造按钮,但我没能找到一个.也许它不在社区版本中?

c# code-generation visual-studio visual-studio-mac

4
推荐指数
1
解决办法
163
查看次数

在 C# 中动态创建的按钮中添加右键单击事件

List<Button> buttonlist = new List<Button>();
for(int i = 0; i< 5;i++){
Button but = new Button();
but.Name = Convert.ToString(i);
but.Location = new Point(50 + i * 20, 50);
but.Size = new Size(20,20);
buttonlist.Add(but);
but.Click += delegate {
//It's a Leftclick 
//Code do stuff
 }
this.Controls.Add(but);
}
Run Code Online (Sandbox Code Playgroud)

目前,我正在 Visual Studio 2017 中使用 C# 制作一个小益智游戏。我动态创建了一些按钮,当我左键单击它时,它会执行一些操作。目前,当我右键单击它时,什么也没有发生。我不知道如何为每个按钮添加“右键单击”事件。如果我右键单击它,它们应该都会执行相同的操作。

有人解决这个问题吗?

谢谢

c# dynamic button right-click winforms

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