服務宗旨

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

我們的成立宗旨就是要以最猛的IT技術讓這個世界更Smart,在我們貫徹我們裡想的同時,我們希望可以把我們所開發的系統帶給台灣的中小企業,除了要推薦好的東西之外,我們也希望做點改變,所以我們的第一目標就是要使用最好用的系統再加上您寶貴的創意,不僅僅可以節省你大量的荷包,還可以有一個像樣的網站。我們可以幫你做的有

企業管理
  • 策略管理
  • 目標管理
  • 行銷管理
  • 財會管理
  • ERP導入
  • 企業流程自訂
資訊管理
  • 網站架設
  • 虛擬化/雲端架設
  • 主機代管
  • 私有雲建制與導入
軟體開發
  • UML設計
  • 版本控管
  • 企業軟體開發
  • APP開發
  • 網頁設計
資訊安全
  • 網頁弱點掃描
  • 主機弱點掃描
  • 木馬檢測
  • 資安鑑識
  • 設計網路架構
  • 資安監控
行銷
  • 關鍵字SEO
  • 社群網路行銷
  • 部落格行銷
  • FaceBook 粉絲團
其他
  • 協助企業申請Google Email
好玩工具開發

講出你的創意吧!沒有甚麼是資訊辦不到的

2017年7月8日 星期六

在.Net 透過 Parallel 類別操控多任務平行作業(二)【軟體開發、軟體設計、系統開發、客製化軟體】

    這篇主要是再次講解 Parallel 類別並行作業的其他支援方法,主要是延續上一篇教學文章 3-1.透過 Parallel 類別操控多任務平行作業(一)。 

    這邊我將透過WPF專案實作一個使用 Parallel.ForEach 方法來支援的循環平行作業任務,它的概念就好比我們常在寫的 for(i=0;i<=10;i++)、或 foreach 迴圈,只是Parallel 類別是充分利用多個處理器、多個核心同時進行作業,執行速度當然效率就快很多。



步驟1:
在 Visual Studio 一樣建立一個WPF 專案

wpf

步驟2:
在 MainWindows.xmal 界面設計成如下結果
parellel

主要是使用了 3個 textbox 控制項,用於讓使用者輸入 資料夾路徑 、想建立的檔案數量、以及每個檔案的大小,再來使用一個 button 按鈕(開始執行 Parallel.Foreach 多任務運算), 來撰寫主要的 並行作業邏輯程式碼。


xaml 程式碼部分畫面
xaml2



步驟3:
在 Button.Click 事件撰寫主要程式碼


程式碼如下:

private void OnClick(object sender, RoutedEventArgs e)
{
    if (string.IsNullOrWhiteSpace(txtDir.Text))
    {
        MessageBox.Show("請輸入目標存放文件的資料夾!!");
        return;
    }


    //如果目標資料夾不存在,就建立一個新的資料夾
    if (!Directory.Exists(txtDir.Text))
    {
        Directory.CreateDirectory(txtDir.Text);
    }


    int fileNum = 0;
    if (!int.TryParse(txtFileNum.Text, out fileNum))
    {
        MessageBox.Show("請輸入檔案的數量!!"); return;
    }


    long fileSize = 0L;
    if (long.TryParse(txtSize.Text, out fileSize) == false)
    {
        MessageBox.Show("請輸入預計每個檔案的大小!!");
        return;
    }


    //記錄要產生新的檔案名稱清單
    List<string> fileNames = new List<string>();


    for (int n = 0; n < fileNum; n++)
    {
        //檔案名稱
        string _filename = "file_" + (n + 1).ToString();


        //資料夾的絕對路徑
        string _dirpath = System.IO.Path.GetFullPath(txtDir.Text);


        //新的檔案的完整路徑
        string fullPath = System.IO.Path.Combine(_dirpath, _filename);


        //加入清單
        fileNames.Add(fullPath);
    }


    txtDisplay.Clear();

    //宣告一個Random 亂書產生器,目的待會用來產生每個檔案的隨機內容
    Random rand = new Random();


    //宣告一個 Action 委派任務,來產生每個檔案與檔案內容
    Action<string> act = (file) =>
        {
            FileInfo fileInfo = new FileInfo(file);


            //如果文件已經存在,就把它刪除
            if (fileInfo.Exists)
                fileInfo.Delete();


            //開始進行隨機寫入內容
            byte[] buffer = new byte[fileSize];
            rand.NextBytes(buffer);


            using (FileStream fs = fileInfo.Create())
            {
                 BinaryWriter sw = new BinaryWriter(fs);
                 sw.Write(buffer);
                sw.Close();
                sw.Dispose();
            }


            //顯示執行結果
            string msg = string.Format("檔案{0}已經建立完成!!\n", fileInfo.Name);
             this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => txtDisplay.AppendText(msg)));


        };

    //開始進行 Parallel 的循環平行任務作業
    Parallel.ForEach<string>(fileNames, act);


}




重點程式碼講解:
1.使用 Random rand = new Random();  ,來隨機產生每個檔案的內容。
2.宣告一個 Action 委派任務,來產生每個檔案與檔案內容。
Action<string> act = (file) =>
    {
        FileInfo fileInfo = new FileInfo(file);


        //如果文件已經存在,就把它刪除
        if (fileInfo.Exists)
            fileInfo.Delete();


        //開始進行隨機寫入內容
        byte[] buffer = new byte[fileSize];
        rand.NextBytes(buffer);


        using (FileStream fs = fileInfo.Create())
        {
            BinaryWriter sw = new BinaryWriter(fs);
            sw.Write(buffer);
            sw.Close();
            sw.Dispose();
        }


        //顯示執行結果
        string msg = string.Format("檔案{0}已經建立完成!!\n", fileInfo.Name);
        this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => txtDisplay.AppendText(msg)));


    };

3.使用 Parallel.ForEach<string> 來開始進行 Parallel 的循環平行任務作業。



參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。
5.在非同步作業時,如何取消非同步任務。
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。







網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

0 意見:

張貼留言

如您對本文有任何建議或意見,歡迎您留下您寶貴的意見!