Net.core 当配置改变时触发回调函数

nuget 多安装 Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Options

https://ballardsoftware.com/adding-appsettings-json-configuration-to-a-net-core-console-application/ 怎么绑定 json config 文件 ,但不能实时更新

http://www.10tiao.com/html/391/201901/2654073587/4.html

https://stackoverflow.com/questions/38515965/cannot-set-configuration-from-json-appsettings-file-in-net-core-project

https://offering.solutions/blog/articles/2017/02/17/automatically-reload-typed-configuration-in-asp-net-core/ asp 的做法 , 但不是 c# console-application/

https://stackoverflow.com/questions/51969527/ioptionssnapshot-in-net-core-console-application-not-working 已经很接近的问题

当config值改变时, 能通知应用程序
https://stackoverflow.com/questions/53604397/how-can-i-build-an-ioptionsmonitort-for-testing

例子 : https://github.com/aspnet/Logging/issues/874

 

 

代码

 

配套配置文件 :

 

c# get cpu use percent and available memory

 

 

其他可取的选项 :

 

 

cronTrigger 的用法

  • 下载地址

https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html

  • 我下载的是 Quartz.NET-3.0.7
  • 然后引用  Quartz.NET-3.0.7\bin\Release\Quartz\net452\Quartz.dll
  • 具体用法:

以下是一个可以运行的例子 ,come from

https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/using-quartz.html

但是, 在原来的基础上, 需要做修改 ,最终代码为

 

修改了这句 :

原来的版本是 :

编译不通过


此外, job 的返回值也要改为 Task

 


job datamap 用来传递 给job的参数

 

  • cronTrigger的表达式

Cron Expressions

Cron-Expressions are used to configure instances of CronTrigger. Cron-Expressions are strings that are actually made up of seven sub-expressions, that describe individual details of the schedule. These sub-expression are separated with white-space, and represent:

    1. Seconds
    1. Minutes
    1. Hours
    1. Day-of-Month
    1. Month
    1. Day-of-Week
    1. Year (optional field)

a)  每三分钟

 

b) 非周末的每2小时 (hour 1,3,5…), 从凌晨1点开始

 

c) 所有天的每2小时

 

e) 周末的每2小时

 

 

 

 

 

 

 

 

 

Mongo DB

  • command line 进入 C:\Program Files\MongoDB\Server\3.4\bin , 打 :  mongo
  • 显示所有  database :  show dbs
  • use database :   use dbname
  • 显示 table ,  in  mango ,  table 叫做 collection :    show collections
  • table filter :

  • ***  怎么模糊filter ?

in command line :  it is :

in c# program ,  should be :

来源于 :

https://stackoverflow.com/questions/8382307/mongodb-c-sharp-query-for-like-on-string

 

 

visual studio Common macros for build commands and properties

编译时经常能看到 这样的宏 :  $(SolutionDir)$(Configuration)\

在这个网址, 能看到所有宏的详细解释  https://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view=vs-2017

 

但是, 如果能看到具体的路径, 当然更明确了, 那么, 怎么看到 ?  或者说,怎么把这些变量print 出来 ?

 

方法是: 项目 properties—–>Build Event—-> pre 或者 post build event 都可以 —-> command line —-> edit ——> macro 

就可以看到这些macro 的 name value pair

 

 

同时运行多个task,带参数, 并等待所有task结束

 

来自: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskfactory.startnew?view=netframework-4.7.2

cron 表达式的定义与解析

  • 用  ncrontab 库解析
  • 如何安装  ncrontab

如图

在 package manage console 输入

即可

 

  • 安装完成后, 可用以下程序测试

程序功能是:  在 2000-1-1  和 2001-1-1 之间, print 所有符合  “0 12 * */2 Mon” 的日期

  • 各种 ncrontab  表达式

需要注意的是: ncrontab 和 cron 是有区别的, 但是ncrontab 也能满足大多数要求

ncrontab 的表达式意思和例子见:

https://code.google.com/archive/p/ncrontab/wikis/CrontabExpression.wiki

https://code.google.com/archive/p/ncrontab/wikis/CrontabExamples.wiki

 

 

How to use List> as datagridview ‘s datasource

 

 

From

https://forums.asp.net/t/1470261.aspx?Use+List+List+string+as+GridView+DataSource

 

 

用C#做一个集中调存储过程并发送邮件的程序

  • UI

c# modern UI 参考

https://www.youtube.com/watch?v=nLfzH4xOVqo&t=0s&index=2&list=PLQ9wcil_P4A54PNtduum8SDilt3cfDnoi


datagridview UI

https://www.youtube.com/watch?v=XyBeTGixw50

  • cron表达式

以前用 NCrontab 库

后来改为 crontrigger

crontrigger 的用法见 :

http://www.notesoflyang.com/?p=1357

  • Logic

a) 用户可自定义task , 包括调用哪个server  , DB name , 存储过程name , 调用时间(cron 表达式) ,标题 , 定义的方式为 自己写入 xml 文件

例子:1

 

b)  当task 执行时间到达时 ,自动执行 sql SP 并把返回的结果写html 格式的文档发送出去。

邮件标题 显示从哪个服务器取的, 什么时间取的 , 列标题。  报告的名字, 订阅的人都有谁

c)有 log 记录task 成功还是失败

  • 各部分功能

1  调存储过程并返回table

数据库暂时用这个测试

调用无参sp   :  [sp_RptTest]

2 将返回的table生成 html 报表,然后发邮件 ,生成的报表类似信用卡账单

3  : 如果 winform 的 FormBorderStyle  = none , 怎么使其移动

https://stackoverflow.com/questions/1241812/how-to-move-a-windows-form-when-its-formborderstyle-property-is-set-to-none

 

4: 当某一个存储过程执行时间过长, 要显示 executing ….

要显示 task 的状态 , 包括  waiting , sending , send fail , send success

5: 可以单独任务启动

6: 可以看单独任务的历史记录

7: 程序能回到任务栏

8 :

  • UI 配色

红色  178, 8, 55

黑色  41 39 40

按钮色  background:#f0f0f0

天蓝色 background: #c9dff0

  • knowledge base

a) email 不能带 js , 也不能带外部 css , 要用inline style

b) 如果想从 gmail  发 , 需要 gmail  允许不够安全的应用:已启用

 

  • 测试 , 以 24机器的daily SOA monitor 为例 :

此任务包括4个stpes

Unbill Daily Check   —- EXEC sp_monitor_soaunbill_4 , 存储过程内部发邮件

Losing Money Report   —  是一个查询后发邮件的存储过程

email generator   —   exec sp_soamon_email_gen  邮件

sms generator   —   exec sp_soamon_sms_gen  —   不知是否需要

Yesterday Low ASR Country Alert  —  是一个查询后发邮件的存储过程

Refresh Sales Contact   —- update SOABalMonitorList
set EmailReceipt = isnull ((select Email from SalesContact B where B.SaleName=(select [SmartBilling].[dbo].f_GetTraderInDate(SOABalMonitorList.CarrierId,getdate()))) ,’ran.zhang@voicehub.com.my’)

 

只需要实现 1,2,5 step ,  将第一步改为 exec [sp_monitor_soaunbill_4_ly]    , 在 SmartBilling_Addon 数据库

此存储过程耗时14分钟

将第二部改为  [sp_Losing_money_ly]  , 在 SmartBilling 数据库

第五步改为 [sp_yesterday_low_ASR_ly_email]  , 在 SmartBilling 数据库

24 密码为   smart.88967aa

 

  • 有用的网站:

a) 从图片取色

 

b)

 

  • 问题:

1—-  user control 怎么加到 form

tools—>option—>window forms design—>general—>automatically populate toolbox  == true

如果还不行, 关 vs , 重新打开

2 —  online regular expression

https://regex101.com/r/pD3xY6/1

 

3 — 如何同时启动多个task,并等待结束

http://www.notesoflyang.com/?p=1271

 

4 — 有时候 gmail 发不出去 , 这是因为google 限制了在未被识别的机器上登陆 , 需要自己修改设置

来自 :

https://stackoverflow.com/questions/51834750/asp-net-smtp-gmail-failed

 

  • 测试用例 (在  office tbhost1)

1: 同时启动4个task,都调用的同一个存储过程 ,

结果, 成功收到了4个邮件

2:

 

 


2019-2-12

在24新建 sp_SOA_Yesterday_Low_ASR_Alert_LY

内容为

 

邮件标题是

Country with Low ASR Yesterday (svr 24 sg main)

发给:

accounts@worldhubcom.com;sales@worldhubcom.com;noc@worldhubcom.com;liang.xue@worldhubcom.cn;sp.kor@worldhubcom.com;chloe.ang@worldhubcom.com

 

 


2019-2-14

在 24 机器上新建存储过程  sp_monitor_soabal_checker_4_LY

是 uncheck_bill 的后续

邮件标题是

SOA Over Threshhold(Main Bill Server)

发给:

mzcw2011@sina.cn;accounts@worldhubcom.com;liang.xue@worldhubcom.com;billing.expandnet@gmail.com;th.ang@worldhubcom.com;sp.kor@worldhubcom.com;chloe.ang@worldhubcom.com

 

把 24机器的soa daily monitor —> uncheck bill 任务停止

 

以上过程在 234 重复一遍


2019-02-18

在 24 机器上新建存储过程 sp_monitor_daily_overdue_LY

每天早八点执行

数据库 addon

邮件标题是   OverDue EveryDay(24 Main)

发给 :  accounts@worldhubcom.com;ryanchwa@yahoo.com;sales@worldhubcom.com;perry.tan@worldhubcom.com;sp.kor@worldhubcom.com;sp.ling@worldhubcom.com

 

对应24机器的job  —   daily overdue rpt


 

在 24 机器上新建存储过程 sp_monitor_dailycash_LY  (先不要)

因为没看到发邮件的部分 , 这个存储过程需要发邮件吗 ?

 

 


列名字如果只是date,没time , 显示时只有date

asr百分比 ,  acd 2位小数

xml 文件里 task name 和 标题头不可重复

 


2019-02-28

 

在 103.244.191.235 机器上新建

新建 sp_monitor_asr_in_hour_LY

此存储过程写数据进 [MonitorASR_InHourly_Detail] 表

—————-

新建 sp_monitor_asr_out_hour_LY

—————-

新建 [sp_monitor_acd_in_hour_LY]

—————-

新建 [sp_monitor_acd_out_hour_LY]

—————-

新建 [sp_monitor_cdr_cache_LY]

—————-

新建 [sp_TwoHourMonitor_asr_in_hour_LY]

 

 


如何在存储过程里面 union

 

https://stackoverflow.com/questions/4746192/conditional-union-in-stored-procedure

 

 


235 machine  create  [sp_monitor_asr_in_hour_Test_LY2019]

完成

[sp_monitor_asr_out_hour_LY]

[sp_monitor_asr_in_hour_LY]

[sp_monitor_acd_in_hour_LY]

[sp_monitor_acd_out_hour_LY]

 

  • 备注 :   发邮件的程序放在  103.244.191.226  ,  name — slidewindow

2019-07-19 因为 smartbilling 的 rpt_daily 表不再存在,

需要改动  sp_Losing_money_ly

用 smartbillingReport 的  dbo.[Hyyyymmdd] 代替 smartbilling 的 rpt_daily

 

 

  • 备注

2019-8-26

程序运行在  103.244.191.226    4899

把原先配置文件中的  sbb1 全部改为 sbb2

又因为  smartbilling 的 rpt_daily 表不再存在,

用 smartbillingReport 的  dbo.[Hyyyymmdd] 代替 smartbilling 的 rpt_daily

具体修改是 , 在 sbb2 新建

这四个存储过程 ,是从 sbb1 抄来的,  但是 用 smartbillingReport 的  dbo.[Hyyyymmdd] 代替 smartbilling 的 rpt_daily

加了这四句

 

————–以下是  2019-08-28 的测试sql ,  在  103.244.191.233

 

 

c# program how to print line number when exception happen

condition :  PDB file exist

 

 

learn from :

https://stackoverflow.com/questions/3328990/c-sharp-get-line-number-which-threw-exception