多執行緒

  • 102
  • 0

需求:有個檔案存放一堆 key word,要拿到搜尋引擎查詢相關結果,回存另一個檔案。

這是最後結果:

static void Main(string[] args)
{
    if (File.Exists(asinPath))
    {
        using (StreamReader sr = new StreamReader(asinPath))
        {
            var asinList = sr.ReadToEnd()
                .Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
                .Where(asin => asin.Length == 10);
            Parallel.For(0, asinList.Count(), new ParallelOptions { MaxDegreeOfParallelism = 10 }, (idx) =>
            {
                QueryAsin(asinList.ElementAt(idx));
            });
        }
    }
}

透過網路查詢,瓶頸一定是網路速度,開多執行緒是考慮作法(傻傻的,一開始還沒想到…
然後寫入 log檔,要用 lock (global_object){  } 包住開檔、寫檔的動作。

以下是一開始笨笨的作法……

static void Main(string[] args)
{
    if (File.Exists(asinPath))
    {
        using (StreamReader sr = new StreamReader(asinPath))
        {
            do
            {
                string asin = sr.ReadLine();
                if (asin.Length != 10)
                {
                    continue;
                }
                QueryAsin(asin);
            }
            while (!sr.EndOfStream);
        }
    }
}

然後中間想到多執行緒,但沒用過幾次(遮臉),中間花了點時間試 Thread, ThreadPool…
花時間不打緊,試半天試不出來才讓人腦羞啊啊啊 <囧>
(想了下,主要是卡在一開始是一行一行讀資料吧…
後來想到在黑暗執行緒看過多執行緒寫法範例,然後記憶回來了一部份,.Net某次改版曾主打超簡便的平行處理……結束這回合。