Task.Run 直接调用Task.Run传入方法,执行。
QueueUserWorkItem
委托异步
线程传参和线程返回值
Thread
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);
}
委托异步
委托异步可以返回任意类型个数的值。
使用委托异步的方式:
如:
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);
}










