ASP.NET - 非同步處理 (二)

  • 4983
  • 0

此篇簡單介紹非同步處理。


 

主程式 : 

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;
        }
    }
}

 

 


多多指教!! 歡迎交流!!

你不知道自己不知道,那你會以為你知道