C# 多线程学习笔记 - 2

本文主要针对 GKarch 相关文章留作笔记,仅在原文基础上记录了自己的理解与摘抄部分片段。 遵循原作者的 CC 3.0 协议。 如果想要了解更加详细的文章信息内容,请访问下列地址进行学习。

原文章地址:https://blog.gkarch.com/threading/part2.html

一、同步概要

同步构造基本分为四种,简单的阻塞方法、锁构造、信号构造、非阻塞同步构造。

1.1 阻塞方法

  1. 阻塞方法一般是会暂停某些线程的执行,例如 Sleep()Join() 方法。当一个线程被阻塞的时候,会立即出让(yields) CPU 时间片,不再消耗处理器时间。
  2. 通过检查线程的 ThreadState 属性来确认某个线程是否被阻塞。
  3. 当某个线程被阻塞或者解除阻塞的时候,会进行上下文切换
  4. 阻塞方法在满足以下几个条件的时候会进行解除。
    • 阻塞条件满足。
    • 操作超时。
    • 通过 Thread.Interrupt() 中断。
    • 通过 Thread.Abort() 中止。

C# 多线程学习笔记 - 1

基础知识

  1. 静态字段是在所有线程当中共享状态的。
  2. 一个线程被阻塞时,不会消耗 CPU 资源。
  3. Join 可以等待另一个线程结束,Sleep 可以将线程阻塞指定的时间,两者使用时线程都是阻塞状态。
  4. Join 可以设置超时时间,当线程执行超过指定时间返回 False。
  5. Thread.Sleep(0) 会释放当前时间片,将 CPU 资源让出给其他线程。
  6. Thread.Sleep(0) 作用与 Thread.Yield() 作用一样,后者只会让出给当前核心的其他线程。
  7. Thread.Yield() 执行时会影响到程序的话,基本可以确定代码存在 Bug。
  8. 在使用 Lambda 表达式启动线程并传入变量的时候,不要在启动线程之后更改被捕获变量的值。
  9. 线程分为前台线程与后台线程,当所有前台线程中止时,程序自动退出。
  10. 可以显式地提高线程优先级,但可能会导致线程饥饿。

C# 结合 using 语句块的三种实用方法

一、简介

阅读 Abp 源码的过程中,自己也学习到了一些之前没有接触过的知识。在这里,我在这儿针对研究学习 Abp 框架中,遇到的一些值得分享的知识写几篇文章。如果有什么疑问或者问题,欢迎大家评论指正。

在本篇主要是 Scoped 范围与 using 语句块的使用。using 语句块大家一定都不陌生,都是与非托管对象一起存在的,它有一个特性就是在 using 语句块结束的时候会调用对象的 IDispose.Dispose() 方法。一般我们会在非托管类型的 Dispose() 方法内部进行资源的释放,类似于 C 语言的 free() 操作。

例如下面的代码:

1
2
3
4
5
6
7
8
9
public void TestMethod()
{
    using(var waitDisposeObj = new TestClass())
    {
        // 执行其他操作 xxx
    }
    
    // 出了语句块之后就,自动调用 waitDisposeObj 的 Dispose() 方法。
}

可以看到上面的例子,using 语句块包裹的就是一个范围 (Scoped)。其实这里可以延伸到依赖注入的概念,在依赖注入的生命周期当中有一个 Scoped 的生命周期。(PS: 需要了解的可以去阅读我的 这篇文章)

Abp + MongoDb 改造默认的审计日志存储位置

一、背景

在实际项目的开发当中,使用 Abp Zero 自带的审计日志功能写入效率比较低。其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起。所以我们可以重新实现 Abp 的 IAuditingStore 接口,来让我们的审计日志数据存储在 MongoDb 当中。

二、实现

2.0 引入相关包

这里我们需要在模块项目引入 Abp 与 mongocsharpdriver 包,引入之后项目如下图。

1547369896595

Built with Hugo
主题 StackJimmy 设计