首页 > 编程语言 >C#知识整理-多线程

C#知识整理-多线程

时间:2024-12-27 16:19:39浏览次数:4  
标签:Console Thread C# text 知识 Start 线程 WriteLine 多线程

进程和线程

进程是一种正在执行的程序。 操作系统使用进程来分隔正在执行的应用程序。 线程是操作系统向其分配处理器时间的基本单元。 每个线程具有计划优先级并维护系统用于保存线程执行暂停时线程上下文的一组结构。 线程上下文包含线程顺畅继续执行所需的全部信息,包括线程的一组 CPU 寄存器和堆栈。 多个线程可在进程上下文中运行。 进程的所有线程共享其虚拟地址空间。 线程可执行任意部分的程序代码,包括其他线程正在执行的部分。 默认情况下,.NET 程序由单个线程(通常称为主线程)启动。 但是,它可以创建其他线程,以与主线程并行或同时执行代码。 这些线程通常称为工作线程。 何时使用多个线程 使用多线程可以提高应用程序的响应能力,并利用多处理器或多核系统提高应用程序吞吐量。 请思考桌面应用程序,其主线程负责用户界面元素并响应用户操作。 使用工作线程执行耗时的操作(这些操作会占用主线程并使用户界面无响应)。 此外,可以使用专用线程,提高网络或设备通信对传入消息或事件的响应能力。 如果程序执行可并行执行的操作,可通过在单独线程中执行这些操作并在多处理器或多核系统中运行程序减少总执行时间。 在此类系统中,使用多线程处理可能会提高吞吐量和响应能力。

线程

通过Thread创建线程
static void Main(string[] args)
{
    Console.WriteLine("Test Thread Start");
    Thread t1 =new Thread(new ThreadStart(StaticMethod));
    t1.Start();

    Thread.Sleep(1000);
    Console.WriteLine("Test Thread End");
}

static void StaticMethod() {
    Console.WriteLine("This is Static Method Start");
    Thread.Sleep(2000);
    Console.WriteLine("This is Static Method End");
}

// output
Test Thread Start
This is Static Method Start
Test Thread End
This is Static Method End

  

将数据传递到线程 代码中有两种数据传递方式
  1. 使用ParameterizedThreadStart
使用ParameterizedThreadStart委托不是传递数据的类型安全方式,因为Thread.Start(Object)方法接受任何对象。
static void StaticMethod1(object text)
{
    Console.WriteLine($"This is Static Method with parameter:{text} Start");
    Thread.Sleep(2000);
    Console.WriteLine($"This is Static Method with parameter:{text} End");
}

Console.WriteLine("Test Thread Start");
Thread t1 = new Thread(StaticMethod1);
t1.Start("test para");
Thread.Sleep(1000);
Console.WriteLine("Test Thread End");
/*
 * output
    Test Thread Start
    Independent task printed 123 lines.
    This is Static Method with parameter:test para Start
    Test Thread End
    This is Static Method with parameter:test para End
 */

  

  1. 将线程过程和数据封装在类中
internal class ThreadWithState
{
    private string _text;
    public ThreadWithState(string text)
    {
        _text = text;
    }

    public void ShowMessage()
    {
        Console.WriteLine($"test thread with state with para:{_text}");
    }
}

ThreadWithState tws = new ThreadWithState("test parameter");
Thread t2 = new Thread(new ThreadStart(tws.ShowMessage));
t2.Start();
// output: test thread with state with para:test parameter

  

  1. 使用callback delegate
internal class ThreadWithState
{
    private string _text;
    private ExampleCallback _callback;
    public ThreadWithState(string text)
    {
        _text = text;
    }
    public ThreadWithState(ExampleCallback callback)
    {
        _callback = callback;
    }

    public void ShowMessage()
    {
        Console.WriteLine($"test thread with state with para:{_text}");
    }

    public delegate void ExampleCallback(int lineCount);
    public static void ResultCallback(int lineCount) {
        Console.WriteLine("Independent task printed {0} lines.", lineCount);
    }
    public void ThreadProc() {
        _callback(123);
    }

    public static void Run() {
        ThreadWithState tws = new ThreadWithState(new ExampleCallback(ResultCallback));
        Thread t = new Thread(new ThreadStart(tws.ThreadProc));
        t.Start();
    }
}

 
ThreadWithState.Run();
// output: Independent task printed 123 lines.

  

线程池 线程池线程是后台线程。 每个线程均使用默认的堆栈大小,以默认的优先级运行,并且位于多线程单元中。 一旦线程池中的线程完成任务,它将返回到等待线程队列中。 这时开始即可重用它。 通过这种重复使用,应用程序可以避免产生为每个任务创建新线程的开销。 每个进程只有一个线程池。 使用线程池的最简单方法是使用 任务并行库 (TPL)。 默认情况下,TPL 类型(例如Task和Task)使用线程池线程来运行任务。
var t = Task<int>.Run(() => {
    // Just loop.
    int max = 1000000;
    int ctr = 0;
    for (ctr = 0; ctr <= max; ctr++)
    {
        if (ctr == max / 2 && DateTime.Now.Hour <= 12)
        {
            ctr++;
            break;
        }
    }
    Console.WriteLine("Task End");
    return ctr;
});
Console.WriteLine("After Task");
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
/*
* output 
After Task
Task End
Finished 1,000,001 iterations.
*/

  

标签:Console,Thread,C#,text,知识,Start,线程,WriteLine,多线程
From: https://www.cnblogs.com/terry841119/p/18636050

相关文章

  • vs code 合并分支,界面操作
    简单描述:如其他分支合并到dev里面,切换到dev分支,然后用终端gitpull一下,再“分支”--"合并" 选择要合并的其他分支,最后推送界面如下:点击切换分支,gitpull 选择要合并的其他分支,合并 点击“合并”后,弹出分支后,选择要合并的分支,如feature_1201分支 最后推送,整个合......
  • FANUC发那科机器人控制箱维修操作流程
    FANUC发那科机器人在工业自动化领域中占有重要地位,其高效、稳定和精确的性能赢得了众多用户的青睐。然而,随着使用时间的增长,可能会出现FANUC机器人控制柜故障,影响到发那科机器人的正常运行。本文将详细介绍发那科FANUC机器人控制箱维修操作流程,帮助企业更好地了解和掌握维修技巧。......
  • CH592 memcpy
    memcpy提速方法:#defineALIGN_MASK0x3#defineCOPY32*d32=*s32;d32++;s32++;#defineCOPY8*d8=*s8;d8++;s8++;#defineSET32(x)*d32=x;d32++;#defineSET8(x)*d8=x;d8++;#defineREPEAT8(expr)exprexprexprexprexprexprexprexprtypedef......
  • Lockpass(密码管理器) v0.0.14
    Lockpass是一款密码管理工具,是作者参考1password做的,目前功能尚不完善,作者会在使用过程中不断优化。软件采用双密码机制,主密码和25字符的key(软件生成)组合成超强密码。软件有随机密码生成工具。保险库功能可以将不同的密码信息分类保存,支持切换不同的账号。软件特色双密码......
  • 使用 CloudFlare CDN网站遇到「重定向的次数过多」解决方案
    在使用CloudFlareCDN的时候,一开始没有问题,但是过了一段时间,发现网站打不开了,网页提示:重定向次数过多解决办法进入cloudflare管理面板,在左侧点击SSL/TLS菜单,在右侧点击Configure配置按钮。在CustomSSL/TLS中选择Full(Strict)选项进行保存即可。......
  • yarn install 安装报错:Workspaces can only be enabled in private projects.
    在本地运行项目的时候,使用yarninstall安装模块依赖的时候,遇到报错:Workspacescanonlybeenabledinprivateprojects.一、原因分析报这个错误是因为你使用了yarn的workspace,但并未将工程标记为private。二、解决办法在项目根目录中的package.json文件中添加p......
  • Python作业有效性评价系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍通过开发人员和系统使用方的沟通,本系统的用户主要有如下几类,教师和学生。(1)教师子系......
  • OpenCV 入门
    OpenCV_Python入门创建/显示窗口方法说明参数返回namedWindow创建一个窗口窗口名称,WINDOW_NORMAL(窗口属性)resizeWindow设置窗口大小窗口名称,宽,高imshow显示窗口窗口名称,要显示的图像destroyAllWindows关闭所有窗口waitKey延时监听键盘按下0无限/单位毫秒键盘按下......
  • OpenCV-Python实战(7)——阈值处理
    一、cv2.threshold()res,dst=cv2.threshold(src=*,thresh=*,maxval=*,type=*) res:函数返回的阈值。dst:阈值处理后的函数。src:要处理的图像。thresh:阈值。maxval:设定像素最大值。type:阈值函数处理方法,常见方法如下表所示:方法值解释THRESH_BINARY0大于阈值取最大值,......
  • 【Leetcode刷题随笔】977 有序数组的平方
    1.题目描述给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9,16,100]2.解题方法2.1方法一:直接排序最......