我在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: …
在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上测试这个.但是我找不到一个按钮来执行此操作.根据这个答案,也就是在"快速行动"一生成构造按钮,但我没能找到一个.也许它不在社区版本中?
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# 制作一个小益智游戏。我动态创建了一些按钮,当我左键单击它时,它会执行一些操作。目前,当我右键单击它时,什么也没有发生。我不知道如何为每个按钮添加“右键单击”事件。如果我右键单击它,它们应该都会执行相同的操作。
有人解决这个问题吗?
谢谢