軟體開發(軟件開發)

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

室內設計、裝潢、窗簾報價估算軟體

網智數位主要提供套裝及客製化的軟體系統解決方案,針對室內設計師、木工、裝潢業產業,量身訂做客製化的軟體,達成客製化、智慧化及網路化的商用軟體。

商用軟體-客製化設計

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

IOT 物聯網-系統開發

根據客戶實際狀況,結合雲端與載具進行客製化物聯網IOT導入與軟體開發

雲端VPS虛擬主機租用

我們的雲端VPS虛擬主機是採用雲端(虛擬化)技術所開發之全新雲端伺服器服務,可以選擇多種作業系統(Windows、Linux等),客戶可載入自訂的應用環境,執行自己所要提供的網路服務,我們的雲端服務可為您的網站提供最完美的解決方案。

ERP軟體客製化導入

ERP軟體客製化導入,室內設計、營造業、裝潢、木作工程、系統櫃工程、會計系統,全面提升公司管理營運效率。

搜尋引擎最佳化SEO

搜尋引擎最佳化(SEO)不僅能提高網站在搜尋結果的排名,更能帶來大量對我們產品或服務真正有需求的訪客。SEO 最棒的特質之一就是不像廣告一樣亂槍打鳥而導致用戶的反感,反而更能提升點閱率跟成交率喔。

服務宗旨

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

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

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

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

顯示具有 非同步化 標籤的文章。 顯示所有文章
顯示具有 非同步化 標籤的文章。 顯示所有文章

2017年9月5日 星期二

在非同步作業時,如何取消非同步任務(軟體開發、程式設計、軟件開發)

      在之前我寫過一篇關於用 Task 類別來撰寫非同步化作業(使用 Task 自行控制非同步任務作業),來利用多CPU、多核心處理器的優勢,這樣可以避免某些邏輯需要較長的時間去執行,而造成主界面程式停頓卡卡,讓使用者誤以為當機、或程式有問題,所以透過.Net 的 Task 任務,可以讓系統自行的調度限制可以用的執行緒(Thread)。

   既然有了 Task 任務類別的支援,可以讓我們輕易的撰寫多工、非同步作業的程式,讓長時間執行的程式透過另外一個執行緒(Thread)在背後執行,例如我常幫工廠或企業寫物料需求計算(MRP、MPS計算)、業績獎金計算、APS先進排程規劃,這些都是需要執行讀取大量的系統資料來進行運算,這就可以充分利用 ThradTask的技術再背後另外一個執行緒去執行,使用者,在前端主畫面還可以繼續執行其他作業,而不用只能等待程式執行完畢。
    不過我們也常常遇到常時間執行的程式,我們可以提供一個按鈕讓使用者去選擇【取消】背後執行的任務,那麼這篇技術文章我就是想講解,如何在.Net 平台取消非同步化作業的任務 ,.net 平台裡有個類別專門跟 Task 、Task<TResult> 類別搭配使用,使得完成取消非同步任務作業的執行,這個類別就是 CancellationTokenSource 類別

我在這邊一樣透過 Step By Step 來建立一個範例程式,來說明整個程式的撰寫技巧…


1.這邊我簡單為了好示範,我建立一個 Windows Form 視窗專案,命名為 CancellationTokenSource_Demo,如下圖:

繪圖

2.在 Form1 表單,我設計了一下畫面
繪圖2
在Form1表單,我為了示範,所以放置了2個 Label (分別顯示 輸入一個正整數、運算結果顯示),2個 Button 按鈕(分別為 進行運算、取消非同步任務),還有一個 ProgressBar (作用於非同步任務執行時,可以顯示進度條狀態)。

3.在 Form1.cs 的後端程式,是最重要的,我把程式標註註解,這樣大家就可以容易理解了。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    /// <summary>
    /// 宣告一個 用於支援取消非同步任務的變數
    /// </summary>
    private CancellationTokenSource cts = null;


    private void btnCalc_Click(object sender, EventArgs e)
    {
        //取得的正整數
        int currNum = 0;
        if (!int.TryParse(txtInputInt.Text, out currNum))
        {
            MessageBox.Show("必須輸入一個正整數數字!");
            return;
        }


        //清楚執行結果
        txtFinalResult.Clear();


        btnStartCalc.Enabled = false; //將【進行運算】按鈕啟用狀態取消
        btnCancel.Enabled = true; //將【取消非同步任務】按鈕啟用狀態啟用


        //用於顯示報告進度條的變數
        IProgress<int> progRpt = new Progress<int>((p) =>
        {
            this.progressBar1.Value = p;
        });


        //如果 CancellationTokenSource 物件變數不是為 null , 比較進行釋放(務必)
        if (cts != null)
         {
            cts.Dispose();
        }


        //實體化 CancellationTokenSource 物件
        cts = new CancellationTokenSource();


        //宣告一個任務變數
        Task<string> task = new Task<string>(() =>
        {
            BigInteger bint = new BigInteger(1d);
            double totalProgress = (double)currNum;


            //如果CancellationTokenSource 物件的 IsCancellationRequested 值為 true ,代表使用者已經將非同步任務進行取消
            for (int i = 1; i <= currNum && !cts.IsCancellationRequested; i++)
            {
                 bint *= i; //相乘
                double progressVal = Convert.ToDouble(i) / totalProgress * 100d;


                //顯示非同步任務執行的進度表
                progRpt.Report(Convert.ToInt32(progressVal));
            }


            //傳回執行結果
            return bint.ToString();


        }, cts.Token, TaskCreationOptions.LongRunning);

        //開始執行非同步任務
        task.Start();


        //等待任務操作完成,等待1秒
        while (!task.Wait(1000))
        {
            Application.DoEvents();
        }


        //顯示運算結果
        txtFinalResult.Text = task.Result;
        btnStartCalc.Enabled = true;
        btnCancel.Enabled = false;
    }


    private void btnCancel_Click(object sender, EventArgs e)
    {
         //使用者執行取消非同步任務
        if (cts != null)
        {
             cts.Cancel();
        }
    }
}


1
2
3

4

4.經過步驟3核心程式碼後,就可以編譯執行,執行結果畫面如下:
4-1.
執行運算中…
r1

4-2.
中途,我執行【取消非同步任務】按鈕
r2
完成上述這樣的示範,就可以撰寫讓使用者中途取消任務的執行。


參考文章
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

2017年5月26日 星期五

C#多工作業與平行處理技術講解

    在現行 CPU 都是多核心的、甚至多顆 CPU 硬體條件下,在我們開發軟體撰寫程式時,就可以好好利用多工作業、平行處理、非同步模型了,所以這次我想好好介紹一下,如何在 .Net C# 平台環境下,撰寫多執行緒平行作業與非同步 程式撰寫技巧與概念。




   
     以往軟體操作使用者,在執行比較耗時的作業時,例如需要大量運算、影像處理等,系統主要使用畫面很容易出現"卡主"、"頓頓"、"當機的感覺",這個很容易造成使用者的抱怨,認為應用程式已經當機,甚至沒有耐心地到【工作管理員】來強制將應用程式關閉,但事實上這會導致造成兩個影響層面,一是,原本應用程式要執行的功能操作,沒有徹底執行完成;二是,如果應用程式一旦被強制關閉時,有可能造成資料的遺失,例如在執行會計系統轉帳功能時,如果只轉部分資料成功、或者盤點作業更新大量庫存成本與數量時,被強制關閉,這時候的資料有可能造成遺失(當然我在開發時這類型,我會用交易處理(Transaction)進行Commit與Rollback,這是另外議題,有機會再來談),所以如果我們可以在需要執行耗時的作業時,就必須考慮使用非同步作業(多工作業、平行處理)技術來撰寫程式,當將比較耗時的作業任務放到另外一個執行緒(Thread),這樣在執行複雜耗時作業時,不會影響到主要的使用者界面(因為使用者界面是另外一個獨立的執行緒),所以使用者可以繼續點選界面、用滑鼠拖移視窗表單都可以,這樣就不會出現卡卡的、要當機的假象。

    原理解釋,當一個使用者執行一個執行檔程式(.exe)時,程序指令就會自動加載到記憶體中去執行,這個就是所謂的應用程式的實例(Instance),而在操作系統中被稱為"Process 行程(大陸用語為 進程 )",Process 與 Process 互相獨立隔離,A Process 不會影響到 B Process 的執行,而每個 Process 又可以包含多個 Thread(執行緒,大陸用語為 線程)。一個 Process 都至少包含一個 Thread (執行緒/線程),主要的 Thread 我們又稱為 Main Thread (主執行緒),當主執行緒被結束終止時,Process(行程/進程)也會跟隨之被關閉,整個應用程式就會被關閉結束。


    經過我上面的解釋,希望讀者可以比較清楚 非同步作業(多工、平行處理)的好處,但是說實在我專案經歷也不淺,跟不同程式開發人員合作也非常頻繁,真正可以把多工平行處理寫得好的真的也算少數,因為本身控制非同步的邏輯思考以及資源鎖定釋放就必須深入的進行了解各種程式技術,不過身為 .Net 開發陣營的我,已經覺得非常幸福,因為 .Net 框架已經把非同步、多工作業封裝成相關類別,程式開發人員不必花太多時間去管理執行緒的底層模型,我們只有好好地學會如何使用這些類別,就可以把多執行緒多工作業寫得很好。


那麼,我想分幾篇文章來講解如何使用 .Net C# 支援的撰寫技巧來介紹,非同步作業的實作方式



以上我會另外花時間各自寫文章來敘述與實作......





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



    
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote