提交
This commit is contained in:
parent
400ee7c6a0
commit
c9c11bcfcf
@ -789,6 +789,8 @@ public class CustomIpRateLimitMiddleware : IpRateLimitMiddleware
|
||||
|
||||
## 使用
|
||||
|
||||
### Hello Quartz.Net
|
||||
|
||||
添加Quartz.Net的引用
|
||||
|
||||
```shell
|
||||
@ -848,6 +850,46 @@ Hello Quartz.Net
|
||||
3. 创建触发器。触发器描述了在何时执行作业。
|
||||
4. 添加调度。当完成以上三步以后,就可以对作业进行调度了。
|
||||
|
||||
### 作业:Job和JobDetail
|
||||
|
||||
Job是作业的类型,描述了作业是如何执行的,这个类型是由我们定义的,例如上文的`HelloQuartzJob`。Job实现IJob接口,而IJob接口只有一个`Execute`方法,参数`context`中包含了与当前上下文中关联的Scheduler、JobDetail、Trigger等。
|
||||
|
||||
一个典型的Job定义如下:
|
||||
|
||||
```c#
|
||||
public class HelloQuartzJob : IJob
|
||||
{
|
||||
public Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
return Task.Factory.StartNew(() =>
|
||||
{
|
||||
Console.WriteLine("Hello Quartz.Net");
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### JobData
|
||||
|
||||
Job不是孤立存在的,它需要执行的参数,这些参数如何传递进来呢?我们来定义一个Job类进行演示。
|
||||
|
||||
```c#
|
||||
public class SayHelloJob : IJob
|
||||
{
|
||||
public string UserName { get; set; }
|
||||
|
||||
public Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
return Task.Factory.StartNew(() =>
|
||||
{
|
||||
Console.WriteLine($"Hello {UserName}!");
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
# NLog 日志记录
|
||||
|
||||
## 介绍
|
||||
|
||||
@ -228,3 +228,105 @@ var arrowFunc = (arg1, arg2) => {
|
||||
在 JavaScript 中,`~` 符号是按位取反运算符。它将操作数的每个二进制位取反,即将 0 变为 1,将 1 变为 0。然后返回这个值的负数加一。
|
||||
|
||||
例如,对于十进制数 10,它的二进制表示为 1010,按位取反后变为 0101,即 5。因此,`~10` 的结果为 -11。
|
||||
|
||||
# 性能优化
|
||||
|
||||
## 防抖(debounce)
|
||||
|
||||
> 多次触发 只执行最后一次
|
||||
|
||||
**作用:**高频率触发的事件,在指定的单位时间内,只相应最后一次,如果在指定时间内再次触发,则重新计算时间。
|
||||
|
||||
防抖类似于英雄联盟回城6秒,如果回城中被打断,再次回城需要再等6秒
|
||||
|
||||

|
||||
|
||||
**实现代码:**
|
||||
|
||||
```javascript
|
||||
<body>
|
||||
<input type="text" id="inp">
|
||||
<script>
|
||||
|
||||
// 1.封装防抖函数
|
||||
function debounce(fn, time) {
|
||||
// 4.创建一个标记用来存放定时器的返回值
|
||||
let timeout = null;
|
||||
return function () {
|
||||
// 5.每当用户触发input事件 把前一个 setTimeout 清楚掉
|
||||
clearTimeout(timeout);
|
||||
// 6.然后又创建一个新的 setTimeout, 这样就能保证输入字符后等待的间隔内 还有字符输入的话,就不会执行 setTimeout里面的内容
|
||||
timeout = setTimeout(() => {
|
||||
// 7.这里进行防抖的内容
|
||||
fn();
|
||||
}, time);
|
||||
};
|
||||
}
|
||||
|
||||
// 2.获取inpt元素
|
||||
var inp = document.getElementById('inp');
|
||||
// 8. 测试防抖临时使用的函数
|
||||
function sayHi() {
|
||||
console.log('防抖成功');
|
||||
}
|
||||
// 3.给inp绑定input事件 调用封装的防抖函数 传入要执行的内容与间隔事件
|
||||
inp.addEventListener('input', debounce(sayHi, 5000));
|
||||
|
||||
</script>
|
||||
</body>
|
||||
```
|
||||
|
||||
**使用场景:**
|
||||
|
||||
search搜索时,用户在不断输入值时,用防抖来节约请求资源。
|
||||
|
||||
## 节流(throttle)
|
||||
|
||||
> 规定时间内 只触发一次
|
||||
|
||||
**作用:**高频率触发的事件,在指定的单位时间内,只响应第一次
|
||||
|
||||
节流类似于英雄联盟里的技能 触发一次必须等技能刷新后才能再次触发
|
||||
|
||||

|
||||
|
||||
**实现代码:**
|
||||
|
||||
```javascript
|
||||
<script>
|
||||
// 1.封装节流函数
|
||||
function throttle(fn, time) {
|
||||
//3. 通过闭包保存一个 "节流阀" 默认为false
|
||||
let temp = false;
|
||||
return function () {
|
||||
//8.触发事件被调用 判断"节流阀" 是否为true 如果为true就直接trurn出去不做任何操作
|
||||
if (temp) {
|
||||
return;
|
||||
} else {
|
||||
//4. 如果节流阀为false 立即将节流阀设置为true
|
||||
temp = true; //节流阀设置为true
|
||||
//5. 开启定时器
|
||||
setTimeout(() => {
|
||||
//6. 将外部传入的函数的执行放在setTimeout中
|
||||
fn.apply(this, arguments);
|
||||
//7. 最后在setTimeout执行完毕后再把标记'节流阀'为false(关键) 表示可以执行下一次循环了。当定时器没有执行的时候标记永远是true,在开头被return掉
|
||||
temp = false;
|
||||
}, time);
|
||||
}
|
||||
};
|
||||
}
|
||||
function sayHi(e) {
|
||||
// 打印当前 document 的宽高
|
||||
console.log(e.target.innerWidth, e.target.innerHeight);
|
||||
}
|
||||
// 2.绑定事件,绑定时就调用节流函数
|
||||
// 敲黑板!!! 这里是重点 绑定是就要调用一下封装的节流函数 触发事件是触发封装函数内部的函数
|
||||
window.addEventListener('resize', throttle(sayHi, 2000));
|
||||
</script>
|
||||
```
|
||||
|
||||
**使用场景:**
|
||||
|
||||
鼠标不断点击触发,mousedown(单位时间内只触发一次)
|
||||
|
||||
监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断
|
||||
@ -41,3 +41,81 @@ Rust 编译工具从链接 [安装 Rust - Rust 程序设计语言 (rust-lang.org
|
||||
|
||||

|
||||
|
||||
上图显示的是一个命令行安装向导。
|
||||
|
||||
**如果你已经安装MSVC(推荐),那么安装过程会非常的简单,输入 1 并回车,直接进入第二步。**
|
||||
|
||||
如果你安装的是MinGW,那么你需要输入 2(自定义安装),然后系统会询问你 Default host triple?,请将上图中 **default host triple**的"msvc"改为"gnu"再输入安装程序:
|
||||
|
||||

|
||||
|
||||
其他属性都默认。
|
||||
|
||||
设置完所有选项,会回到安装向导界面(第一张图),这时我们输入 1 并回车即可。
|
||||
|
||||

|
||||
|
||||
进行到这一步就完成了Rust的安装,可以通过以下命令测试:
|
||||
|
||||
```shell
|
||||
rustc -V # 注意大写的 V
|
||||
```
|
||||
|
||||

|
||||
|
||||
如果以上两个命令能够输出你安装的版本号,就是安装成功了。
|
||||
|
||||
## 搭建 Visual Studio Code 开发环境
|
||||
|
||||
安装`rust-analyzer`和`Native Debug`两个扩展。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
重新启动 VsCode,Rust 的开发环境就搭建好了。
|
||||
|
||||
现在新建一个文件夹,如 RustLearn。
|
||||
|
||||
在VsCode中打开新建的文件夹。
|
||||
|
||||
打开文件夹后,新建终端。
|
||||
|
||||
输入以下命令:
|
||||
|
||||
```shell
|
||||
cargo new greeting
|
||||
```
|
||||
|
||||
当前文件夹下会构建一个名叫 greeting 的 Rust 的工程目录。
|
||||
|
||||
在终端里输入以下三个命令:
|
||||
|
||||
```shell
|
||||
cd ./greeting
|
||||
cargo build
|
||||
cargo run
|
||||
```
|
||||
|
||||
系统在创建工程时会生成一个Hello World源程序main.rs,这时会被编译运行:
|
||||
|
||||
# Cargo 教程
|
||||
|
||||
## Cargo 是什么
|
||||
|
||||
Cargo 是 Rust 的构建系统和包管理器。
|
||||
|
||||
Rust 开发者 常用 Cargo 来管理 Rust 工程和获取工程所依赖的库。在上个教程中我们曾使用 cargo new greeting 命令创建一个名为 greeting 的工程,Cargo 新建了一个名为 greeting 的文件夹并在里面部署了一个 Rust 工程最典型的文件结构。这个 greeting 文件夹就是工程本身。
|
||||
|
||||
## Cargo 功能
|
||||
|
||||
Cargo 除了创建工程以外还具备构建(build)工程、运行(run)工程等一系列功能,构建和运行分别对应以下命令:
|
||||
|
||||
```shell
|
||||
cargo build
|
||||
cargo run
|
||||
```
|
||||
|
||||
Cargo 还具有获取包、打包、高级构建等功能,详细使用方法参见 Cargo 命令。
|
||||
|
||||
## 在
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user