parameterizedthreadstart,C# 多线程,ThreadStart()里面的方法带了参数就提示错误
朋友们,parameterizedthreadstart和C# 多线程,ThreadStart()里面的方法带了参数就提示错误是当今热门话题,但是它们的内涵和影响力可能会让人感到困惑。在本篇文章中,我将为你们揭示它们的本质和重要性,希望能够为你们带来新的认识。
之Thread类以及对为什么设置线程优先级
1.C#对线程进行操作时,通过Thread类,可以对线程进行创建、挂起、恢复、休眠、终止及设置优先级。
Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法)
在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中。用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级
2.Thread类常用的属性:
CurrentThread获取当前正在运行的线程
IsAlive获取一个值,该值只是当前线程的执行状态
Name获取或设置线程的名称
Priority获取或设置一个值,该值只是线程的调度优先级
ThreadState获取一个值,该值包含当前线程的状态
3.Thread类常用的方法:
Abort调用此方法通常会终止线程
Join阻止调用线程,直到某个线程终止时为止
Resume继续已挂起的线程
Sleep将当前线程阻止指定的毫秒数
Start使线程被安排进行执行
Suspend挂起线程,或者如果线程已挂起,则不起作用
4.创建线程--Start()方法
创建一个线程,只需将其声明并为其提供线程起始点处的方法委托。
Thread类具有接受一个ThreadState委托或ParameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法。
只有在调用Start方法后才会创建实际的线程。Start方法的两种重载方式:
(1)导致操作系统将当前实例的状态更改为ThreadState.Running
语法:public void Start()
说明:该方法无参数,无返回值
(2)使操作系统当前实例的状态更改为ThreadState.Running,并选择线程执行所需要的方法
语法:public void Start(Object parameter)
说明:参数parameter表示一个对象,包含线程执行的方法要使用的数据
注意:如果线程已经终止,就无法通过再次调用Start方法来重新启动
5.线程的挂起与恢复--Suspend方法和Resume方法
(1)Suspend方法
该方法用来挂起线程,如果线程已经挂起则不起作用
语法:public void Suspend()
说明:调用Suspend方法挂起线程时,.net允许要挂起的线程再执行几个指令,目的是为了到达.net认为线程可以安全挂起的状态
(2)Resume方法
该方法用来继续已挂起的线程
语法:public void Resume()
说明:通过Resume方法来恢复被暂停的线程是,无论调用了多少次Suspend方法,调用Resume方法均会使另外的线程脱离挂起状态,并导致当前线程继续执行
6.线程休眠--Sleep()方法
该方法用来将当前线程阻止指定的时间,有两种重载方式
(1)将当前线程挂起指定的时间
语法:public static void Sleep(int millisecondsTimeout)
说明:参数millisecondsTimeout表示线程被阻止的毫秒数,指定零以指示应挂起此线程以使其他等待线程能够执行;指定Infinite以无限期阻止线程
(2)将当前线程阻止指定的时间
语法:public static void Sleep(TimeSpan timeout)
说明:参数timeout表示线程被阻止的时间量的TimeSpan,指定零以指示应挂起此线程以使其他等待线程能够执行;指定Infinite以无限期阻止线程
7.终止线程
终止线程可以分别使用Abort方法和Join方法实现
(1)Abort方法
用来终止线程,有两种重载形式,都是引发的ThreadAbortExecption
public void Abort()--终止进程
public void Abort(Object stateInfo)--终止线程并提供有关线程终止的异常信息
参数stateInfo是一个对象,包含应用程序特定的信息(如状态),该信息可供正被终止的线程使用
(2)Join方法
Join用来阻止调用线程,直到某个线程终止时为止。有三种重载形式
public void Join()
public bool Join(int millisecondsTimeout)
说明:参数millisecondsTimeout表示等待线程终止的毫秒数。如果线程已终止,则返回值为true,如果线程经过了millisecondsTimeout指定时间后未终止,返回值为false
public bollJoin(TimeSpan timeout)
说明:参数timeout表示等待线程终止的时间量TimeSpan。如果线程已终止,则返回值为true,如果线程经过timeout时间量之后未终止,则返回值为false
8.线程的优先级
AboveNormal可以将Thread安排在具有highest优先级线程之后,在Normal之前
BelowNormal在Normal之后,Lowest之前
Highest在具有任何其他优先级的线程之前
Lowest在具有其他任何优先级的线程之后
Normal在AboveNormal之后,BelowNormal之前。默认值。
可以通过调用线程的Priority属性来获取和设置其优先级。Priority属性用来获取或设置一个值,该值指示线程的调度优先级。
语法:public ThreadPriority Priority{get;set;}
说明:属性值是ThreadPriority枚举值之一,默认值为Normal。
实例代码:
[csharp]view plaincopy
staticvoidMain(string[]args)
{
Threadthread1=newThread(newThreadStart(Thread1));//使用自定义方法Thread1声明线程
thread1.Priority=ThreadPriority.Lowest;//设置线程的调度优先级
Threadthread2=newThread(newThreadStart(Thread2));//使用自定义方法Thread2声明线程
thread1.Start();//开启线程一
thread2.Start();//开启线程二
Console.ReadLine();
}
staticvoidThread1()
{
Console.WriteLine("线程一");
}
staticvoidThread2()
{
Console.WriteLine("线程二");
}
运行截图:
注意:这里很多人都疑惑了,既然thread1优先级比thread2优先级低,为什么还是先输出的thread1的内容呢?
其实那是因为你不了解线程的优先级实现原理
线程的优先级并不是你想象的先执行哪个后执行哪个
而是所有的线程不论优先级高低都会执行,
优先级越高表示CPU分配给该线程的时间片越多,执行时间就多
优先级越低表示CPU分配给该线程的时间片越少,执行时间就少
C# 多线程,ThreadStart()里面的方法带了参数就提示错误
线程操作主要用到Thread类,他是定义在System.Threading.dll下。使用时需要添加这一个引用。该类提供给我们四个重载的构造函数(以下引自msdn)。
Thread(ParameterizedThreadStart)初始化 Thread类的新实例,指定允许对象在线程启动时传递给线程的委托。
Thread(ThreadStart)初始化 Thread类的新实例。
由.NET Compact Framework支持。
Thread(ParameterizedThreadStart, Int32)初始化 Thread类的新实例,指定允许对象在线程启动时传递给线程的委托,并指定线程的最大堆栈大小。
Thread(ThreadStart, Int32)初始化 Thread类的新实例,指定线程的最大堆栈大小。
由.NET Compact Framework支持。
我们如果定义不带参数的线程,可以用ThreadStart,带一个参数的用ParameterizedThreadStart。带多个参数的用另外的方法,下面逐一讲述。
一、不带参数的
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace AAAAAA
{
class AAA
{
public static void Main()
{
Thread t= new Thread(new ThreadStart(A));
t.Start();
Console.Read();
}
private static void A()
{
Console.WriteLine("Method A!");
}
}
}
结果显示Method A!
二、带一个参数的
由于ParameterizedThreadStart要求参数类型必须为object,所以定义的方法B形参类型必须为object。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace AAAAAA
{
class AAA
{
public static void Main()
{
Thread t= new Thread(new ParameterizedThreadStart(B));
t.Start("B");
Console.Read();
}
private static void B(object obj)
{
Console.WriteLine("Method{0}!",obj.ToString());
}
}
}
结果显示Method B!
三、带多个参数的
由于Thread默认只提供了这两种构造函数,如果需要传递多个参数,我们可以自己将参数作为类的属性。定义类的对象时候实例化这个属性,然后进行操作。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace AAAAAA
{
class AAA
{
public static void Main()
{
My m= new My();
m.x= 2;
m.y= 3;
Thread t= new Thread(new ThreadStart(m.C));
t.Start();
Console.Read();
}
}
class My
{
public int x, y;
public void C()
{
Console.WriteLine("x={0},y={1}", this.x, this.y);
}
}
}
结果显示x=2,y=3
四、利用结构体给参数传值。
定义公用的public struct,里面可以定义自己需要的参数,然后在需要添加线程的时候,可以定义结构体的实例。
//结构体
struct RowCol
{
public int row;
public int col;
};
//定义方法
public void Output(Object rc)
{
RowCol rowCol=(RowCol)rc;
for(int i= 0; i< rowCol.row; i++)
{
for(int j= 0; j< rowCol.col; j++)
Console.Write("{0}", _char);
Console.Write("\n");
}
}
parameterizedthreadstart和C# 多线程,ThreadStart()里面的方法带了参数就提示错误的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!