这里为什么会出现多线程?原因是DebugLZQ在写一个LINQ综合Demo的时候遇到了多线程便停下手来整理一下关于多线程的文章园子里很多很多因此关于多线程理论性的东西LZ就不去多说了这篇博文主要是用最简单的例子总结下多线程调用函数的相关注意点重点偏向应用和记忆
多线程调用无参函数
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemThreading;
namespace 多线程 {
class Program
{
static void Main(string[] args)
{
ConsoleWriteLine(主线程开始);
Thread t = new Thread(new ThreadStart(ShowTime));//注意ThreadStart委托的定义形式
tStart();//线程开始控制权返回Main线程
ConsoleWriteLine(主线程继续执行);
//while (tIsAlive == true) ;
ThreadSleep();
tAbort();
tJoin();//阻塞Main线程直到t终止
ConsoleWriteLine();
ConsoleReadKey();
}
static void ShowTime()
{
while (true)
{
ConsoleWriteLine(DateTimeNowToString());
}
}
}
}
注意ThreadStart委托的定义如下:
可见其对传递进来的函数要求是:返回值void无参数
多线程调用带参函数(两种方法)
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemThreading;
namespace 多线程_带参数 {
class Program
{
static void Main(string[] args)
{
ConsoleWriteLine(Main线程开始);
Thread t = new Thread(new ParameterizedThreadStart(DoSomething));//注意ParameterizedThreadStart委托的定义形式
tStart(new string[]{HelloWorld});
ConsoleWriteLine(Main线程继续执行);
ThreadSleep();
tAbort();
tJoin();//阻塞Main线程直到t终止
ConsoleReadKey();
}
static void DoSomething(object s)
{
string[] strs = s as string[];
while (true)
{
ConsoleWriteLine({}{}strs[]strs[]);
}
}
}
}
注意ParameterizedThreadStart委托的定义如下:
可见其对传入函数的要求是:返回值void参数个数参数类型object
using System;
using SystemCollectionsGeneric; u
sing SystemLinq;
using SystemText;
using SystemThreading;
namespace 多线程_带参数 {
class Program
{
static void Main(string[] args)
{
Guest guest = new Guest()
{
Name=Hello Age=
};
Thread t = new Thread(new ThreadStart(guestDoSomething));//注意ThreadStart委托的定义形式
tStart();
ThreadSleep();
tAbort();
tJoin();//阻塞Main线程直到t终止
ConsoleReadKey();
}
}
//
class Guest
{
public string Name { get; set; }
public int Age { get; set; }
public void DoSomething()
{
while (true)
{
ConsoleWriteLine({}{} Name Age);
}
}
}
}
这个还是使用ThreadStart委托对方法进行了一个封装
两种方法可随意选择第一种貌似简洁一点
线程同步
线程同步的方法有很多很多种volatileLockInterLockMonitorMutexReadWriteLock
这里用lock说明问题:在哪里同步用什么同步同步谁?
首先感受下不同步会出现的问题:
代码就是下面的代码去掉lock块
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemThreading;
namespace 多线程_同步 {
class Program
{
static object obj = new object();//同步用
static int balance = ;
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(Credit));
tStart();
Thread t = new Thread(new ThreadStart(Debit));
tStart();
ConsoleReadKey();
}
static void Credit()
{
for (int i = ; i < ; i++)
{
lock (obj)
{
balance += ;
ConsoleWriteLine(After creditingbalance is {} balance);
}
}
}
static void Debit()
{
for (int i = ; i < ; i++)
{
lock (obj)
{
balance = ;
ConsoleWriteLine(After debitingbalance is {} balance);
}
}
}
}
}
小结:多线程调用函数就是这样在Winform中控件绑定到特定的线程从另一个线程更新控件不应该直接调用该控件的成员这个非常有用