C#多线程访问定义的全局变量(lock线程锁)
来源:互联网 发布:软件使用说明书 编辑:程序博客网 时间:2024/05/21 22:56
手动和自动同时访问全局变量时,就有可能出现线程不同步的问题。以下主要利用lock线程锁来修改解决方案,使线程同步,详细代码如下。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Threading;namespace treadTest{ //定义委托 public delegate void ListBoxDelegate(); public partial class Form1 : Form { public Form1() { InitializeComponent(); } //委托处理方法(关联与ListBoxDelegate) private void ListBox() { if (!listBox1.InvokeRequired)//如果在UI主线程操作ListBox, { listBox1.Items.Add(CommonData.plus());//则直接进行控件操作,“与UI主线程相关联” listBox1.SelectedItem = listBox1.Items[listBox1.Items.Count - 1]; } else//如果是在另一线程操作ListBox,则启用委托 listBox1.Invoke(new ListBoxDelegate(listShow)); } //定义对UI主线程控件的操作,“与AddAuto相关联”。 private void listShow() { listBox1.Items.Add(CommonData.plus()); listBox1.SelectedItem = listBox1.Items[listBox1.Items.Count - 1]; } //定义线程函数 private void AddAuto() { while (CommonData.Flag == 0) { Thread.Sleep(1000); ListBox();//不能直接控制UI上的控件,所以用该方法选择使用委托 } } //在click事件中启动多线程 private void btnStart_Click(object sender, EventArgs e) { //线程标志置0,表示开启线程 CommonData.Flag = 0; //定义 ThreadStart的委托类型的参数,并使该委托指向线程函数 ListBoxDelegate mycn = new ListBoxDelegate(AddAuto); //实例化线程 Thread insertTxt = new Thread(new ThreadStart(mycn)); //启动线程 insertTxt.Start(); } private void btnAbort_Click(object sender, EventArgs e) { CommonData.Flag = 1; } private void btnCtrlMain_Click(object sender, EventArgs e) { ListBox(); } private void btnReset_Click(object sender, EventArgs e) { CommonData.num = 0; } private void btnClear_Click(object sender, EventArgs e) { listBox1.Items.Clear(); } private void btnQuit_Click(object sender, EventArgs e) { Application.Exit(); } } //全局变量解决方案 public class CommonData { private static int _Flag = 0; private static int _num = 0; public static int plus() { lock (new object()) { return _num++; } } public static int Flag { get { return _Flag; } set { _Flag = value; } } public static int num { get { return _num; } set { _num = value; } } }}
- C#多线程访问定义的全局变量(lock线程锁)
- C#多线程,静态锁static lock和非静态锁lock的区别及附跨线程访问UI的代码
- 多线程学习之一:线程对共享全局变量的访问
- C# 关于线程锁lock的使用方法
- C#多线程Lock锁定的使用例子(多线程线程同步)
- C#多线程Lock锁定的使用例子(多线程线程同步)
- C#多线程编程实战(从入门到精通系列)第四篇 线程锁lock的用法
- [C#学习笔记之多线程2]多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore .
- 解决多线程访问全局变量的解决方案
- C#如何定义全局变量
- C# WebForm定义全局变量
- 多线程拨号C#版(探讨lock和Monitor线程同步)
- C#多线程开发:使用lock语句同步多个线程
- C#多线程中通过lock实现线程同步
- c# 中多线程同步Lock的用法
- C#多线程中lock的用法
- c#多线程中Lock()关键字的使用
- c#多线程中Lock()的用法
- 一些3D的基本知识
- Linux文件属性、权限设置
- JNI:使用RegisterNatives方法传递和使用Java自定义类
- Web应用界面设计规范
- IE下 struts中使用滤镜对本地图片进行预览
- C#多线程访问定义的全局变量(lock线程锁)
- hdu 2103
- 万能 FreeSWITCH directory 脚本
- linux 中关于java的环境
- JDBC批处理
- FSM 有限状态机
- web容器 web服务器 servlet/jsp容器 之间的区别和关系
- JS得到当前鼠标的坐标
- linux定时执行,脚本问题解决汇总