//跨线程执行多放到过程事件内部,具体参考串口收发(最易懂例)
this.Invoke((EventHandler)(delegate
{
this.receivebox.Text = strIncoming;//跨线程执行部分
}));
//跨线程访问ID自带委托
this.Invoke((EventHandler)(delegate
{
Loads();
}
));
//跨线程调用
方法一: (不建议)
Control.CheckForIllegalCrossThreadCalls = false; //不检查跨线程的调用是否合法
string comst;
//private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
//{
// comst = comboBox1.Text;
//}
public void control_EventData(string data)
{
string str = data.Substring(0, 9);
this.Invoke(new Action(() => { textBox1.Text = str; }));
ParameterizedThreadStart th=new ParameterizedThreadStart(InsertCord);
th(comst);
}
private delegate void DeleRun(String str);
void InsertCord(object comstr)
{
if (label3.InvokeRequired)//等待异步(不清楚Control所在线程选择一个被控线程界面Control作映射)
{
DeleRun d = new DeleRun(InsertCord);
label3.Invoke(d, comstr);
}
else
{
//界面控制部分代码
label3.Text = comboBox1.Text + "已完成打卡";
textBox1.Text = "";//其它控件也可以调用了
Application.DoEvents();
Thread.SpinWait(300000000);
}
}
//通过类调用参数
RUN.V1 R1=new RUN.V1();
RUN.V1 R2 = new RUN.V1();
Thread t1 = new Thread(new ParameterizedThreadStart(R1.Print));
Thread t2 = new Thread(new ParameterizedThreadStart(R2.Print));
t1.Start("线程一:");
t2.Start("线程二:");
t3.Start("线程三:");
Console.ReadKey();
//具体类
namespace ConsoleApplication1
{
public class RUN
{
public void Print(object Value)
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(Value+i.ToString());
TimeSpan.FromSeconds(300);
}
}
}
}
//跨线程参数传入
//Form1
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2= new Form2();
frm2.Show();
Action<Object> SetP = m => frm2.SetProg(100, 20);
ParameterizedThreadStart ParaTh = new ParameterizedThreadStart(SetP);
Thread th = new Thread(ParaTh);
th.Start();
}
//Form2
public void SetProg(int max, int progvalue)
{
MessageBox.Show("1234");
}
Application.DoEvents();//交还界面控制权
Thread.Sleep(5000); //延时5秒
Thread.SpinWait(1000000000);//延时10秒
//也可用于单线程
using System.Threading.Tasks;
var task_1 = Task.Run(async delegate
{
await Task.Delay(3000);
Console.WriteLine("3秒后执行,方式一 输出语句...");
return "异步执行result"; //可以得到一个返回值(int,bool,string都试了)
});
//利用Action达到多线程参数传入执行
Action<string,string,string> th1 = new Action<string,string,string>(Send.SendR);
th1.Invoke("localhost", "guest", "guest");
//直接引动Lambda表达式
this.Invoke(new Action(() => {TextBox1.Text +=DateTime.Now+":"+data+"\r\n"; }));
//通过匿名委托创建
Thread thread1 = new Thread(delegate () { Console.WriteLine("我是通过匿名委托创建的线程!"); });
thread1.Start();
//通过Lambda表达式创建
Thread thread2 = new Thread(() => Console.WriteLine("我是通过Lambda表达式创建的委托"));
thread2.Start();
//线程池
//public static bool SetMaxThreads (int workerThreads, int completionPortThreads);
//workerThreads 线程池中辅助线程的最大数目
//completionPortThreads 线程池中异步 I/O 线程的最大数目
//返回值 Boolean 如果更改成功,则为 true;否则为 false
static void Main(string[] args)
{
//设置线程总数
bool b= ThreadPool.SetMaxThreads(50, 50);
Console.WriteLine("设置状态:"+b.ToString());
ThreadPool.QueueUserWorkItem(new WaitCallback(SubWorkerMethod));
ThreadPool.QueueUserWorkItem(new WaitCallback(SubWorkerMethod),"666");
int w,c;
ThreadPool.GetMaxThreads(out w,out c);
Console.WriteLine("辅助线程MAX数:" + w + "\r\n" + "异步 I/O 线程的MAX数" + c);
Console.ReadKey();
}
private static Action<object> SubWorkerMethod = (state) =>
{
if (Equals(state, null))
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
Console.WriteLine("state is NUll");
}
else
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
Console.WriteLine("state not is null");
}
};
1.1 System.Threading.Thread类
Thread类是是控制线程的基础类,位于System.Threading命名空间下,具有4个重载的构造函数:
名称 说明
Thread(ParameterizedThreadStart)
初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。要执行的方法是有参的
Thread(ParameterizedThreadStart, Int32) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托,并指定线程的最大堆栈大小
Thread(ThreadStart)
初始化 Thread 类的新实例。要执行的方法是无参的
Thread(ThreadStart, Int32)
初始化 Thread 类的新实例,指定线程的最大堆栈大小
2.1 线程的常用属性
属性名称 说明
CurrentContext 获取线程正在其中执行的当前上下文
CurrentThread 获取当前正在运行的线程
ExecutionContext 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息
IsAlive 获取一个值,该值指示当前线程的执行状态
IsBackground 获取或设置一个值,该值指示某个线程是否为后台线程
IsThreadPoolThread 获取一个值,该值指示线程是否属于托管线程池
ManagedThreadId 获取当前托管线程的唯一标识符
Name 获取或设置线程的名称
Priority 获取或设置一个值,该值指示线程的调度优先级
ThreadState 获取一个值,该值包含当前线程的状态
2.2 线程的优先级别
当线程之间争夺CPU时间时,CPU按照线程的优先级给予服务。高优先级的线程可以完全阻止低优先级的线程执行.NET为线程设置了Priority属性来定义线程执行的优先级别,里面包含5个选项,其中Normal是默认值.除非系统有特殊要求,否则不应该随便设置线程的优先级别
成员名称 说明
Lowest 可以将 Thread 安排在具有任何其他优先级的线程之后
BelowNormal 可以将 Thread 安排在具有 Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前
Normal 默认选择.可以将 Thread 安排在具有 AboveNormal 优先级的线程之后,在具有 BelowNormal 优先级的线程之前
AboveNormal 可以将 Thread 安排在具有 Highest 优先级的线程之后,在具有 Normal 优先级的线程之前
Highest 可以将 Thread 安排在具有任何其他优先级的线程之前
2.2.3 System.Threading.Thread的方法
Thread 中包括了多个方法来控制线程的创建、挂起、停止、销毁,以后来的例子中会经常使用
方法名称 说明
Abort() 终止本线程
GetDomain() 返回当前线程正在其中运行的当前域
GetDomainId() 返回当前线程正在其中运行的当前域Id
Interrupt() 中断处于WaitSleepJoin线程状态的线程
Join() 已重载.阻塞调用线程,直到某个线程终止时为止
Resume() 继续运行已挂起的线程
Start() 执行本线程
Suspend() 挂起当前线程,如果当前线程已属于挂起状态则此不起作用
Sleep() 把正在运行的线程挂起一段时间
Interlocked类共享变量原子操作锁
方法 作用
CompareExchange() 安全比较两个值是不是相等。如果相等,将第三个值于其中一个值交换
Decrement() 安全递减1,相当于 i--
Exchange() 安全交换数据,相当于 a = 30
Increment() 安全递加1,相当于 i++
Add() 安全相加一个数值,相当于 a = a + 3
Read() 安全读取数值,相等于int a=b