C# 线程相关知识总结

2020-06-17 15:24:00王振洲
Task.Run    直接调用Task.Run传入方法,执行。
static void Main() 
{
 Task.Run(() => Go());
}
 
static void Go()
{
 Console.WriteLine ("Hello from the thread pool!");
}

QueueUserWorkItem

QueueUserWorkItem没有返回值。使用 QueueUserWorkItem,只需传递相应委托的方法就行。

static void Main()
{
 //Go方法的参数data此时为空
 ThreadPool.QueueUserWorkItem (Go);
 //Go方法的参数data此时为123
 ThreadPool.QueueUserWorkItem (Go, 123);
 Console.ReadLine();
}
 
static void Go (object data) 
{
 Console.WriteLine ("Hello from the thread pool! " + data);
}

委托异步

委托异步可以返回任意类型个数的值。
使用委托异步的方式:

声明一个和方法匹配的委托 调用该委托的BeginInvoke方法,获取返回类型为IAsyncResult的值 调用EndInvoke方法传递IAsyncResulte类型的值获取最终结果

如:

static void Main()
{
 Func<string, int> method = Work;
 IAsyncResult cookie = method.BeginInvoke ("test", null, null);
 //
 // ... 此时可以同步处理其他事情
 //
 int result = method.EndInvoke (cookie);
 Console.WriteLine ("String length is: " + result);
}
 
static int Work (string s) { return s.Length; }

使用回调函数来简化委托的异步调用,回调函数参数为IAsyncResult类型

static void Main()
{
 Func<string, int> method = Work;
 method.BeginInvoke ("test", Done, method);
 // ...
 //并行其他事情
}
 
static int Work (string s) { return s.Length; }
 
static void Done (IAsyncResult cookie)
{
 var target = (Func<string, int>) cookie.AsyncState;
 int result = target.EndInvoke (cookie);
 Console.WriteLine ("String length is: " + result);
}

使用匿名方法

Func<string, int> f = s => { return s.Length; };
 f.BeginInvoke("hello", arg =>
 {
   var target = (Func<string, int>)arg.AsyncState;
   int result = target.EndInvoke(arg);
   Console.WriteLine("String length is: " + result);
 }, f);

线程传参和线程返回值

Thread

Thread构造函数传递方法有两种方式:

public delegate void ThreadStart();
public delegate void ParameterizedThreadStart (object obj);

所以Thread可以传递零个或一个参数,但是没有返回值。

使用lambda表达式直接传入参数。
static void Main()
{
 Thread t = new Thread ( () => Print ("Hello from t!") );
 t.Start();
}
 
static void Print (string message) 
{
 Console.WriteLine (message);
}
调用Start方法时传入参数
static void Main()
{
 Thread t = new Thread (Print);
 t.Start ("Hello from t!");
}
 
static void Print (object messageObj)
{
 string message = (string) messageObj;  
 Console.WriteLine (message);
}