[c#]多线程总结(结合进度条)(代码片段)

zhaoshujie zhaoshujie     2023-01-01     177

关键词:

线程生命周期

  1. 未启动状态:当线程实例被创建但 Start 方法未被调用时的状况。
  2. 就绪状态:当线程准备好运行并等待 CPU 周期时的状况。
  3. 不可运行状态
    • 已经调用 Sleep 方法
    • 已经调用 Wait 方法
    • 通过 I/O 操作阻塞
  4. 死亡状态:当线程已完成执行或已中止时的状况。

Thread 常用方法:

  • public void Interrupt()    中断处于 WaitSleepJoin 线程状态的线程。
  • public void Join()         在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。
  • public void Start()        开始一个线程
  • public static void Sleep(int millisecondsTimeout)    让线程暂停一段时间

一 普通线程

分为两种,一种是不需要给子线程传参数,Thread t = new Thread(new ThreadStart(void () target)); 另一种是要给子线程传一个参数,Thread t = new Thread(new ParameterizedThreadStart(void (object) target));

技术分享图片
// 普通线程
private void btn1_Click(object sender, EventArgs e)

    progressBar.Value = 0;
    Thread tt = new Thread(new ThreadStart(DoWork1));
    tt.Name = "不带参数普通线程";
    tt.Start();
    Thread t = new Thread(new ParameterizedThreadStart(DoWork2));
    t.Name = "带参数普通线程";
    t.IsBackground = true;
    t.Start(100);
    _msg += "当前线程的执行状态:" + t.IsAlive + "
";
    _msg += "当前托管线程的唯一标识:" + t.ManagedThreadId + "
";
    _msg += "线程名称:" + t.Name + "
";
    _msg += "当前线程的状态:" + t.ThreadState;
    MessageBox.Show("消息:
" + _msg, "提示", MessageBoxButtons.OK);

// 线程方法
private void DoWork1()

    for (int i = 0; i < 100; i++)
    
        // 跨线程访问 UI,BeginInvoke 采用异步委托
        progressBar.BeginInvoke(new EventHandler((sender, e) =>
        
            progressBar.Value = i;
        ), null);
    

// 线程方法
private void DoWork2(object obj)

    for (int i = 0; i < (int)obj; i++)
    
        progressBar.BeginInvoke(new EventHandler((sender, e) =>
        
            progressBar.Value = i;
        ), null);
    
普通线程

二  线程池

public static bool QueueUserWorkItem(WaitCallback);

public static bool QueueUserWorkItem(WaitCallback, object);

线程池默认为后台线程(IsBackground)

技术分享图片
private void btn3_Click(object sender, EventArgs e)

    ThreadPool.QueueUserWorkItem(DoWork2, 100);
    // 或者
    ThreadPool.QueueUserWorkItem((s) =>
    
        int minWorkerThreads, minCompletionPortThreads, maxWorkerThreads, maxCompletionPortThreads;
        ThreadPool.GetMinThreads(out minWorkerThreads, out minCompletionPortThreads);
        ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxCompletionPortThreads);
        MessageBox.Show(String.Format("WorkerThreads = 0 ~ 1, CompletionPortThreads = 2 ~ 3",
            minWorkerThreads, maxWorkerThreads, minCompletionPortThreads, maxCompletionPortThreads));
        DoWork2(100);
    );

// 线程方法
private void DoWork2(object obj)

    for (int i = 0; i < (int)obj; i++)
    
        // Thread.Sleep(50);
        progressBar.BeginInvoke(new EventHandler((sender, e) =>
        
            progressBar.Value = i;
        ), null);
    
线程池

三  BackgroundWorker

技术分享图片
private void btn4_Click(object sender, EventArgs e)

    progressBar.Value = 0;
    BackgroundWorker bw = new BackgroundWorker();
    bw.WorkerReportsProgress = true;// 是否报告进度更新
    // 线程执行
    bw.DoWork += new DoWorkEventHandler((obj, args) =>
    
        for (int i = 0; i < 100; i++)
        
            bw.ReportProgress(i);
        
    );
    // UI主线程显示进度
    bw.ProgressChanged += (obj, progressChangedEventArgs) =>
    
        progressBar.Value = progressChangedEventArgs.ProgressPercentage;
    ;
    // 线程执行完成后的回调函数
    bw.RunWorkerCompleted += (obj, runWorkerCompletedEventArgs) =>
    
        MessageBox.Show("子线程执行完成!");
    ;
    if (!bw.IsBusy)
    
        bw.RunWorkerAsync();
    
BackgroundWorker

三  Task(.NET 4.0以上版本)

参考博客 http://www.cnblogs.com/luxiaoxun/p/3280146.html

技术分享图片
private void btn5_Click(object sender, EventArgs e)

    progressBar.Value = 0;
    Task<bool> t = new Task<bool>(maxValue => DoWork((int)maxValue), progressBar.Maximum);
    t.Start();
    t.Wait();
    // 任务完成后继续延续任务
    Task cwt = t.ContinueWith(task => MessageBox.Show("The result is " + t.Result));

// 线程方法
private bool DoWork(int maxValue)

    for (int n = 0; n < maxValue; n++)
    
        progressBar.BeginInvoke(new EventHandler((sender, e) =>
        
            progressBar.Value = n;
        ), null);
    

    return true;
Task

四  异步委托

参考博客 http://www.cnblogs.com/luxiaoxun/p/3280146.html

技术分享图片
public delegate string MyDelegate(object arg);

private void btn6_Click(object sender, EventArgs e)

    MyDelegate myDelegate = new MyDelegate(DoWork3);
    IAsyncResult result = myDelegate.BeginInvoke(100, DoWork2Callback, "回调函数参数");

    // 异步执行完成
    string resultStr = myDelegate.EndInvoke(result);


// 线程函数
private string DoWork3(object arg)

    for (int n = 0; n < (int)arg; n++)
    
        progressBar.BeginInvoke(new EventHandler((sender, e) =>
        
            progressBar.Value = n;
        ), null);
    

    return "Finished";


// 异步回调函数
private void DoWork2Callback(IAsyncResult arg)

    MessageBox.Show(arg.AsyncState.ToString());
异步委托

五  附 跨线程访问UI之 SynchronizationContext (同步上下文)

技术分享图片
private void btn2_Click(object sender, EventArgs e)

    SynchronizationContext context = SynchronizationContext.Current;
    new Thread(() =>
    
        for (int i = 0; i < 100; i++)
        
            // Send方法是发送一个异步请求消息
            //context.Send((s) =>
            //
            //    progressBar.Value = i;
            //, null);
            // Post方法是发送一个同步请求消息
            context.Post((s) =>
            
                progressBar.Value = i;
            , null);
        
    ).Start();
SynchronizationContext

六  参考资料:

☆多线程讲解 http://www.w3cschool.cc/csharp/csharp-multithreading.html

http://www.cnblogs.com/luxiaoxun/p/3280146.html

c#上位机开发——多线程+进度条的使用(代码片段)

1.界面设计2.使用多线程修改进度条引入多线程类库命名空间:usingSystem.Threading;将变量添加到Form1类:privateThreadth;将方法添加到Form1类:privatevoidThreadTask()intstp;intnewval;Randomrnd=newRandom();while(true)stp=this.progressBar1.Step... 查看详情

实现winfrom进度条及进度信息提示,winfrom程序假死处理(代码片段)

方法一:使用线程    功能描述:在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法... 查看详情

c#多线程总结(纯干货)(代码片段)

线程基础创建线程staticvoidMain(string[]args)Threadt=newThread(PrintNumbers);t.Start();//线程开始执行PrintNumbers();Console.ReadKey();staticvoidPrintNumbers()Console.WriteLine("Starting...");for(inti=1;i<10;i+ 查看详情

多线程任务更新 1 个进度条 - UI C# WPF

】多线程任务更新1个进度条-UIC#WPF【英文标题】:Multiplethreadstasksupdating1progressbar-UIC#WPF【发布时间】:2021-07-1619:30:51【问题描述】:我一直在四处寻找有类似问题的人,但没有找到任何东西。我正在使用WPFUI编写C#应用程序。要... 查看详情

c#通过线程来控制进度条(转)--讲解多线程对界面的操作

//通过创建委托解决传递参数问题privatevoid_btnRun_Click(objectsender,System.EventArgse){RunTaskDelegaterunTask=newRunTaskDelegate(RunTask);//委托同步调用方式runTask(Convert.ToInt16(_txtSecond.Value));}//通过创建委托解决传递参数问题,通过委托的 查看详情

wpf多线程进度条更新进度(代码片段)

主要的使用类:DispatcherusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;us... 查看详情

pythongui编程:音乐播放器(多线程爬虫进度条文件)(代码片段)

...5.代码实现1.程序运行结果Python实现音乐播放器(爬虫、多线程、进度条、文件)2.程序实现原理本音乐播放器GUI方面运用Python的tkinter实现,播放的音乐来自网络爬虫和本电脑已经有的。为了使整个程序运行起来不卡顿,运... 查看详情

pyqt5进度条qprogressbar的使用/多线程更新/按钮美化/图片编码/开机自启动(代码片段)

前言诚如标题所见,我在使用Pyqt5进行开发时,先后遇到了上面几个问题。本篇博客就用来记录遇到问题/解决问题的过程,希望能给遇到相同问题的读者一些参考。项目背景我的项目是构建一个可视化的交互界面࿰... 查看详情

实现winfrom进度条及进度信息提示

1、方法一:使用线程    功能描述:在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容... 查看详情

进度条---socket---socketserver(代码片段)

...socket socketserversocketserver内部使用io多路复用,以及多线程和多进程,从而实现并发处理多个客户端请求的socket服务端即:每个客户端请求连接到服务器时,socket服务端都会在服务器端创建一个线程或者进程,负责处理对应的... 查看详情

c#控制台console进度条(代码片段)

1说明笔者大多数的开发在Linux下,多处用到进度条的场景,但又无需用到图形化界面,所以就想着弄个console下的进度条显示。2步骤清行显示//清行处理操作intcurrentLineCursor=Console.CursorTop;//记录当前光标位置Console.SetCursorPosition(0,Co... 查看详情

c#欢迎画面显示程序启动进度条,并自动打开主界面(代码片段)

...#xff1a;具体实现代码如下:软件界面加载时先启动后台线程进行延时操作,并实时显示到进度条上,待进度条完成后(也就是线程结束)程序会自动响应线程结束事件(注意这个响应事件是主线程上的,... 查看详情

带有 Swing 进度条的多线程

】带有Swing进度条的多线程【英文标题】:MultithreadingwithSwingprogressbar【发布时间】:2015-05-2822:52:31【问题描述】:在执行RMI连接期间,我想不出如何让进度条响应,所以我决定向您寻求帮助。代码如下:ThreadperformLogin=newThread(newR... 查看详情

python多线程(代码片段)

...;文章来源:https://www.runoob.com/python/python-multithreading.html多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了... 查看详情

linux进度条小程序(结合缓冲区相关知识)(代码片段)

文章目录一.行缓冲二.\\n和\\r三.进度条实现一.行缓冲#include<stdio.h>#include<string.h>#include<unistd.h>intmain()printf("helloworld!\\n");sleep(5);#include<stdio.h>#include<string.h># 查看详情

linux进度条小程序(结合缓冲区相关知识)(代码片段)

文章目录一.行缓冲二.\\n和\\r三.进度条实现一.行缓冲#include<stdio.h>#include<string.h>#include<unistd.h>intmain()printf("helloworld!\\n");sleep(5);#include<stdio.h>#include<string.h> 查看详情

winform进度条实现(代码片段)

...使用c#做WinFrom开发,要实现进度条效果就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死。1、设计界面,注意需要引用 using System.Threading;控件名称分别为:progressBar1;label1;textBox1&#... 查看详情

Xamarin Android C# 中的进度条和线程

】XamarinAndroidC#中的进度条和线程【英文标题】:ProgressbarandthreadinXamarinAndroidC#【发布时间】:2018-10-3023:53:08【问题描述】:我尝试使用这种方法加载我的SQL。当我点击按钮登录时,该方法正在工作,它显示了循环进度对话框,但... 查看详情