此篇簡單介紹非同步處理。
主程式 :
using System;
using System.Threading.Tasks;
using System.Threading;
namespace ThreadDay2
{
// 起始非同步工作
//TPL 的核心類別是 Task,所以接著就來看看如何使用 Task 類別來處理非同步工作。首先要了解的,當然就是建立和起始非同步工作了。
class Program
{
static void Main(string[] args)
{
// 寫法1 - .NET 2 開始提供
ThreadPool.QueueUserWorkItem(state =>MyTask("寫法1"));
ThreadPool.QueueUserWorkItem(MyTask, "寫法1-2");
// 寫法2 - .NET 4 開始提供 Task 類別
var t = new Task(MyTask, "寫法2");
t.Start();
// 寫法3 - 也可以用靜態方法直接建立並開始執行
Task.Factory.StartNew(MyTask, "寫法3");
// 寫法4 - .NET 4.5 的 Task 類別新增了靜態方法 Run 直接建立並開始執行
Task.Run(() => MyTask("寫法4"));
/////////////////////////////////////////////////////////
// 使用 Task 達到非同步執行 與 取得執行結果
// 取得來源網站的Context
string url = "http://huan-lin.blogspot.com/";
var task = new Task<int>(() => GetContentLength(url));
task.Start();
task.Wait();
var result = task.Result;
Console.WriteLine("Url Content Length: {0}", result);
Console.ReadLine();
}
static void MyTask(object message)
{
string msg = message as string;
Console.WriteLine("{1}, 工作執行緒 #{0}", Thread.CurrentThread.ManagedThreadId,msg);
}
static int GetContentLength(object state)
{
var client = new System.Net.Http.HttpClient();
var url = state as string;
var resultString = client.GetStringAsync(url).Result;
Console.WriteLine(resultString);
var resultLength = client.GetStringAsync(url).Result.Length;
return resultLength;
}
}
}
多多指教!! 歡迎交流!!
你不知道自己不知道,那你會以為你知道