惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
C
Check Point Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
The Hacker News
The Hacker News
L
LINUX DO - 热门话题
T
Tenable Blog
Hugging Face - Blog
Hugging Face - Blog
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
P
Proofpoint News Feed
H
Hacker News: Front Page
P
Privacy & Cybersecurity Law Blog
月光博客
月光博客
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
博客园_首页
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
Forbes - Security
Forbes - Security
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
aimingoo的专栏
aimingoo的专栏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
O
OpenAI News
G
Google Developers Blog
Martin Fowler
Martin Fowler
罗磊的独立博客
S
SegmentFault 最新的问题
T
Tor Project blog
量子位

博客园 - sPhinX

如何解决在Win11下卸载McgsPro失败的问题 如何离线安装WinDbg Preview 敏捷软件开发 原则、模式与实践 第9章的例子程序(C#版) Oracle存储过程解析XML内容 P/Invoke继续谈 有意思的案例: 的问题 dnSpy - 让调试镜像文件的工作变得轻松点 dnSpy调试IIS(w3wp进程) Xilium.CefGlue与SingleProcess rocketmq-client-cpp(2.0.1)编译指南 RocketMQ .NET客户端的那些坑 P/Invoke今日谈 .NET编译问题汇总 动态的世界 使用ProcDump自动生成Dump文件 Process.Start可能无法选中指定文件的问题 获取本地IP 将exe和dll打包为一个exe文件 .NET异步资料收集
Akavache简明使用指南
sPhinX · 2021-05-14 · via 博客园 - sPhinX
// 初始化
Akavache.Registrations.Start(applicationName: "AkavacheExperiment");
// 默认提供了四个常用持久化的方式:
// LocalMachine:默认持久化的文件保存在%LOCALAPPDATA%\ApplicationName\BlobCache文件夹下
// UserAccount:默认持久化的文件保存在%APPDATA%\ApplicationName\BlobCache文件夹下
// Secure:默认持久化的文件保存在%APPDATA%\ApplicationName\SecretCache文件夹下,数据加密
// InMemory:默认保存在内存中,数据加密
BlobCache.Secure
    .GetOrFetchObject("Key", () => GetTable())
    .Catch<DataTable, Exception>(ex =>
    {
        return Observable.Return(new DataTable());
    })
    .Subscribe(ar =>
    {
        dataReady = true;
    });

如果要修改默认JsonSerializerSettings

var jsonSerializerSettings = new JsonSerializerSettings
{
    Converters = new JsonConverter[] { new DataTableConverter() }
};
Splat.Locator.CurrentMutable.RegisterConstant(jsonSerializerSettings, typeof(JsonSerializerSettings));

如果要修改持久化的文件路径,自己实例化一个SQLitePersistentBlobCache或者SQLiteEncryptedBlobCache,然后调用实例即可

var blobCache= new SQLitePersistentBlobCache(Path.Combine(Application.StartupPath, "LocalCache", "LocalCache.bin"));

 在Akavache中还发现了这样一个类,KeyedOperationQueue,翻译过来就是“带有名称的操作队列”,可以把操作分到不同名称的队列当中,队列中的操作按顺序依次执行

转帖一个测试用例体会下

[Fact]
public void KeyedOperationQueueCorrectlyShutsDown()
{
   var fixture = new KeyedOperationQueue();
   var op1 = new Subject<int>();
   var op2 = new Subject<int>();
   var op3 = new Subject<int>();
   bool isCompleted = false;

   int op1Result = 0, op2Result = 0, op3Result = 0;

   fixture.EnqueueObservableOperation("foo", () => op1).Subscribe(x => op1Result = x);
   fixture.EnqueueObservableOperation("bar", () => op2).Subscribe(x => op2Result = x);

   // Shut down the queue, shouldn't be completed until op1 and op2 complete
   fixture.ShutdownQueue().Subscribe(_ => isCompleted = true);
   Assert.False(isCompleted);

   op1.OnNext(1);
   op1.OnCompleted();
   Assert.False(isCompleted);
   Assert.Equal(1, op1Result);

   op2.OnNext(2);
   op2.OnCompleted();
   Assert.True(isCompleted);
   Assert.Equal(2, op2Result);

   // We've already shut down, new ops should be ignored
   fixture.EnqueueObservableOperation("foo", () => op3).Subscribe(x => op3Result = x);
   op3.OnNext(3);
   op3.OnCompleted();
   Assert.Equal(0, op3Result);
}