C#多线程访问定义的全局变量(lock线程锁)
手动和自动同时访问全局变量时,就有可能出现线程不同步的问题。以下主要利用lock线程锁来修改解决方案,使线程同步,详细代码如下。
【C#多线程访问定义的全局变量(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;
}
}
}
}
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- Linux下面如何查看tomcat已经使用多少线程
- 说得清,说不清