首页 > 编程语言 >C#使用线程和线程同步

C#使用线程和线程同步

时间:2022-10-29 11:35:34浏览次数:66  
标签:同步 Thread C# System 线程 thread1 new using


操作系统由多个进程的运行来维持的,进程又被细化为线程(Thread)。一个完整的进程拥有独立的内存空间,同一个进程内的线程是共享内存空间和数据。
在C#中线程使用委托的方式来完成,定义线程的同时,必须定义对应的委托对象,最后还要定义一个能够被线程调用的方法。

简单多线程

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
// 定义委托
delegate void SetText(string s);

// 定义委托
SetText setText;

// 定义委托
Thread thread1;

public Form1()
{
InitializeComponent();
label1.Text = "0";
// 实例化委托
setText = new SetText(set_lableText);
}

private void button1_Click(object sender, EventArgs e)
{
// 实例化线程,调用run方法
thread1 = new Thread(new ThreadStart(run));
// 开始线程
thread1.Start();
}

private void set_lableText(string s)
{
label1.Text = s;
}

private void run()
{
for (int i = 0; i < 10; i++)
{
// 通过调用委托,改变标签的值
label1.Invoke(setText, new object[] { i.ToString() });
// 线程休眠1000毫秒
Thread.Sleep(1000);
}
}

private void Form1_Formclosing(object sender, FormClosedEventArgs e)
{
if (thread1.IsAlive) // 判断现场是否存在
{
// 注销thread1
thread1.Abort();
}
}
}
}

线程的生命周期

C#使用线程和线程同步_c#

线程同步

当遇到以下下两种情况,需要线程间同步执行:
1、多个线程向一个变量复制或多线程改变同一对象属性
2、某些线程等待另一些线程执行某些操作后才能执行。

可以使用lock加锁和Monitor类实现线程同步。
以下两种实现方法等效:

lock(x)
{
DoSomthing();
}
object myobj = (object)x;
System.Threading.Monitor.Enter(myobj);
try
{
DoSomthing();
}
finally
{
System.Threading.Monitor.Exit(myobj);
}

具体实例

using System;
using System.Security.Cryptography;
using System.Text;
using System.Threading;

namespace ConsoleApp1
{
class Program
{
private static object myObj = new object();
[STAThread]
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Do));
thread1.Name = " 线程1 ";
Thread thread2 = new Thread(new ThreadStart(Do));
thread2.Name = " 线程2 ";
thread1.Start();
thread2.Start();

// Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止。
thread1.Join();
thread2.Join();
Console.ReadKey();
}

static void Do()
{
if (!Monitor.TryEnter(myObj))
{
Console.WriteLine(" 不能访问" + Thread.CurrentThread.Name);
return;
}
try
{
Monitor.Enter(myObj);
Console.WriteLine(" 可以访问" + Thread.CurrentThread.Name);

// 线程休眠
Thread.Sleep(5000);
}
finally
{
Monitor.Exit(myObj);
}
}
}
}

当线程1获取了myOjb对象独占时,线程2尝试调用TryEnter,此时会由于午发获取独占权而返回false。

C#使用线程和线程同步_多线程_02

参考

​https://learn.microsoft.com/zh-cn/dotnet/standard/threading/using-threads-and-threading​


标签:同步,Thread,C#,System,线程,thread1,new,using
From: https://blog.51cto.com/lilongsy/5805838

相关文章

  • C#用FiddlerCore抓包HTTP和HTTPS
    FiddlerCore是收费软件,提供了Fiddler的抓包API,能抓取HTTP和HTTPS的网络请求。官网:https://www.telerik.com/fiddlercore安装FiddlerCore依赖引用有两种方式:1、通过Teleri......
  • 【P4314】CPU监控(线段树维护区间历史信息)
    线段树维护区间历史信息的模板题。看了cmd的博客。大概思路是:由于我们需要求出历史信息,所以暴力的做法是在做区间修改时的tag我们先不合并,而是按时间顺序存一个tag......
  • C#实现MD5加密(32位md5加密和16位md5加密)
    MD5是经典HASH算法,这里用C#实现一边:usingSystem;usingSystem.Security.Cryptography;usingSystem.Text;namespaceConsoleApp1{classProgram{//32位md......
  • C#的LINQ select查询、where过滤、group分组、join关联
    语言集成查询(LanguageIntegratedQuery)是一系列直接将查询功能集成到C#语言的技术统称,用于在所有基于.NET平台的变成语言中更加直接地声明跨越、过滤和投射操作的一......
  • Java通过jdbc连接MySql数据库进行操作
    下载​​MySql​​驱动包​​https://dev.mysql.com/downloads/connector/j/​​解压,把文件夹中的​​jar​​包拷贝到项目文件中新建一个java类进行连接​​db1​​是我......
  • Scanner类
    1、需要传参:System.in2、scanner.next()接收字符串类型3、scanner.nextInt()接收整型packagecom.ke.demo1;importjava.util.Scanner;publicclassdemo1{......
  • [Vue warn]: Method “components“ has type “object“ in the component definitio
    [Vuewarn]:Method“components”hastype“object”inthecomponentdefinition.Didyoureferencethe报错如下:仔细检查代码发现:components写到methods方法里面去......
  • 云小课|MRS基础原理之CarbonData入门
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击......
  • 贝叶斯推理三种方法:MCMC 、HMC和SBI
    对许多人来说,贝叶斯统计仍然有些陌生。因为贝叶斯统计中会有一些主观的先验,在没有测试数据的支持下了解他的理论还是有一些困难的。本文整理的是作者最近在普林斯顿的一个......
  • Mockito使用方法(Kotlin)
    一、为什么要使用Mockito1.实际案例1.1遇到的问题对于经常维护的项目,经常遇到一个实际问题:需求不停改变,导致架构经常需要修改某些概念的定义。对于某些十分基础又十分......