分類: 網頁設計

K書中心自動控制系統與兌幣機整合系統(軟體開發、Arduino整合)

我們網智數位軟體-開發顧問,今年在南部受委託承接K書中心的自動控制系統,完整的功能規劃包含,可以控制每個座位的無線電力控管、出入口閘門控制、入口觸控劃位系統、櫃台中控系統、以及收銀系統、連客戶的兌換機系統,都是我們完全從無到有開模、嵌入Arduino板子、以及研發軟體來控制,讓客戶可以從硬體到軟體的整合全部交給我們去規劃。

量身定做的兌幣機系統

41266770_306707126574600_1606583373776551936_n

閘門半成品

41344613_235574300419715_6151643690549903360_n


我們軟體開發團隊,擅長利用 Arduino、3D列印、模型輸出、以及軟體客製化,來協助客戶一條龍服務,



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

越南-惡魔雞排連鎖店委託開發餐飲管理系統

       去年台商引進知名的惡魔雞排在越南擴展了許多複合式餐飲連鎖分店,因為該台商之前委託網智數位軟體開發團隊開發量身客製化的軟體,運用在工廠端管理系統,因此對我們有信心,又再次委託我們開發中央餐廚管理系統,讓我們的知識領域又有機會接觸餐飲產業。


cm20160403___ba9b53c19c2419ca88452c065ccf5818954

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



報價系統、估價系統、收款系統(軟體開發/客製化軟體)

      網智數位軟體開發團隊,因為協助多家室內裝修、壁紙、窗簾、地板、磁磚、工程建設等行業,開發一系列管理軟體,也深知該行業群,一直有頻繁的估價/報價需求,而大多數都是使用紙本抄寫,或者好一點的是使用Excel進行報價管理,但因為沒有好的軟體系統可以使用,顯得耗時、不專業、甚至款項常常是否有正確都發生爭議,也無法立刻追溯客戶歷史的報價成交資料,所以我們特別針對室內設計業、裝橫業、木工裝修業等開發出專屬的報價收款管理系統我們的報價單可以根據自行定義的工程施工類型(例如,木作、油漆、水電等),進行類型集中估價(報價),也可以再細分估價的區域位置(例如,廚房、玄關、臥室、廁所、客廳..等),只要輸入數量、單位、價格,系統都會自動統計金額,如下系統部分截圖。


估價-報價主畫面

image

主畫面,系統都會自動計算,估價總金額…

報價細項輸入
image

可以選取工程類型

image

可以選取施工區域
image

系統會自動統計,各工程的金額

image

系統自動計算、已實際收到的款項、最後收款日期、後續工程追加金額

、未收金額,是否已結案(只要款項都收齊,系統自動結案),這樣內部收款負責人,可以很清楚地藉由系統來了解哪些工程案未結案、款項未收齊。
image


系統也可以直接列印報價單給客戶進行確認回簽,使得可以呈現更專業的一面

image

image


目前呈現部分系統軟體的畫面,更完整的流程功能,請洽詢我們,我們也可以量身定做符合您的軟體功能。




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

my_qrcode_1519621481105



管理軟體的重點實施效益(軟體開發、客製化軟體、ERP)

        網智數位成立到目前,幾乎大部分客戶都是來自不同領域產業的軟體客製化需求委託開發,也有很大比例是已有現成軟體導入或操作使用經驗、不乏市面上知名的套裝軟體,但一定是使用一段時間,真的發覺跟自己公司的營運作業流程不一致,導致事實上要需要很多人工費時費力的檢核,所以委外一個好的軟體開發團隊,一定必須深入該產業或公司進行深入流程觀察流程、文件以及目前所遇到最大的問題,希望系統管理軟體可以有效解決或提升人工的作業模式效率。

LINE_ALBUM_AI產生圖_240212_697

        企業決心實施ERP管理軟體前一個至關重要的命題,只有選對了、選準了才能更好的提高企業管理,不然就會適得其反,可是面對市場上林林總總、千差萬別的ERP廠商和各類系統套裝管理軟體,企業就會無從下手,更不知該如何選擇,所以我給出幾個想法與建議:

1、靈活嗎?
說到靈活性,有的人是不贊同的,以為靈活性不嚴肅,但客戶的需求必須靠靈活性來支持,舉個簡單的例子,任何一個企業的資薪政策都是隨營業情況而變的,也可能因組織機構改變而改變,也可能因考核方法不同而改變,那麼工資的計算方法就自然而變了,是不是要設死在軟件裡,當然不是,其實管理軟體中的薪資計算關係,傳遞關係很多很複雜,如果是一一寫在程序裡,客戶要改變時要找軟體公司改程序,這樣的軟體就缺乏靈活性,實施時會面對客戶層出不窮的新需求而無可奈何。
所以當你選型做技術考察時,一定要記得問:軟體支持計算公式的設置嗎?如果是,請要求設置,看你出的計算公式算的結果對不對。如果不能設,就可以判定此軟體不具有靈活性,實施失敗的可能性會升高很多,因為你的需要沒有被滿足,而如果這是關鍵的需求,那麼就嚴重了,非得二次開發不可,再舉例目前我在開發產業的ERP,目前事實上就遇到窗簾產業在計算產品價格的複雜性、不是一般軟體的所謂BOM表可以單純地解決成本、售價計算,以及產品零件的多組合型,所以開發了很多公式可以彈性應用。

 2、實用嗎?
那麼所謂的實用?實用就是輸入方便、不易出錯、查詢快速、多個條件查詢。那種要培訓N多還不能操作的軟體就說不上實用,因為簡單的東西容易學,複雜的東西記不住,軟體應該做得操作簡便,至於查詢方面,就最好不要使用者記什麼,隨便就可以看到他想要的關鍵字。


3、可擴展嗎?
一個ERP、管理軟體應該是要可以擴展的,為什麼?因為客戶的需要是擴展的,比如說,ERP中有這個報表好,但我還想要另外一種ERP中沒有的報表,怎麼辦?又要找開發商二次開發?如果這樣,就沒有擴展性,沒有擴展性,就支持不了客戶潛在的需求和未來的發展。有擴展性的ERP軟體是客戶可以根據自己的需要來擴充單據、報表的,並且能即時建立與原來數據的關係。
所以當你選型做技術考察時,一定要記得問:你們的軟件可以自己建新表,接入到已有的業務流程中去嗎?如果是,就要他做做看,ERP實施時這種事是經常有的,你的企業也不會例外;如果不是,實施失敗的可能性又會升高很多,因為你的需要沒有被滿足,而如果這是關鍵的需求,那麼就嚴重了,非得二次開發不可。
所以一個實用的、有靈活性的、可擴展的ERP軟體是實施成功的技術基礎,在這個基礎上再去談別的吧,否則失望就是回報,無論你付出多大努力。

 

(其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) – 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異
ERP 系統的淺談與優勢
ERP 系統在中小企業如何有效利用條碼與QRCode
[ ERP/MRP 系統 ] – 專案導入深入剖析
ERP 導入的投資報酬評估(ERP客製化、進銷存軟體)
ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)
管理軟體的重點實施效益(軟體開發、客製化軟體、ERP)

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

my_qrcode_1519621481105

 

 

KM知識管理系統-軟體開發、客製化軟體

     網智數位﹣軟體開發團隊,今年協助台灣最大的馬達承軸器廠商,今天台灣、上海同步進行展示發表,開發智慧型的維修知識管理系統,只要輸入各種設備故障原因,系統自動會導引故障的排除方式、以及需要的檢測項目、各種歷年來的統計數據報告,協助企業員工多年來的經驗與知識透過資訊科技軟體進行傳遞,創新引導員工處理維修問題,也從隱形的知識資產變成可見的有形資產,再度證明資訊科技可以有效提升企業的無形競爭力…

WechatIMG2

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

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰

業務合作、軟體委外開發

業務窗口:allen@netqna.com

聯繫電話:0920-883-870

公司電話:02-55991310

公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓

skype: netqna

line:netqna

微信:netqna

黃先生 Allen

my_qrcode_1519621481105

企業形象設計-網頁設計

     客戶委託我們設計形象網頁,以下是初步設計作品…..

image
image

image

參考網址:
http://pws.pwsworldsystem.com

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

my_qrcode_1519621481105

客戶案例-維修知識管理系統(軟體開發、軟件開發、程式設計)

       網智數位開發團隊去年協助台灣最大代理機械軸封及聯軸器的廠商,開發維修知識管理平台,結合了該產業的維修技能知識整理成數位資料,可以讓台灣、以及大陸、其他國家的經銷商,可以共同登入此平台,查閱維修技術知識、零件資料查閱、更重要的可以有智能地協助各地維修師傅,在上千個複雜零件,如遇到故障該如何進行維修排除建議的決策管理系統 ,導入這樣有效率的平台,也是委託企業的總經理非常有獨特的遠見,知道如何利用資訊軟體工具,把該公司多年來資深老員工多年來的隱形知識變成可以分享與傳遞的顯性知識,以利企業內部甚至是結合上下供應鏈、合作經銷商,充分地在AI與物聯網、雲端資訊化的浪潮下,更鞏固企業的競爭力。


image


image



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

Java Script D3 資料過濾教學(軟體設計、軟體開發)

       我在網頁繪圖時,現在常使用 D3 來幫客戶做成統計視覺圖表,但一定會遇到客戶要求在使用者界面上可以進行某些條件的過濾篩選,例如根據勾選或者執行某個按鈕(Button)時,可以顯示或隱藏網頁部分元素圖表,而這樣需求條件,我們就可以利用 Java Script D3 支援的 Filter 函數來實作此需求案例。


案例執行畫面如下

2017-12-04_11-11-28


//完整程式碼如下:

<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8″>
     <title>網智數位 Java Script D3 過濾資料技巧</title>
     <link rel="stylesheet" type="text/css" href="styles.css"/>
     http://d3.js
</head>


<body>



     var data = [ //          {price: 200, category: “捲簾"},
         {price: 300, category: “直立式軌道"},
         {price: 350, category: “木片百葉窗"},
         {price: 500, category: “木竹簾羅馬"},
         {price: 1000, category: “電動軌道"},
         {price: 800, category: “蜂巢簾"},
         {price: 900, category: “百葉窗"},
         {price: 500, category: “壁紙"},
         {price: 300, category: “耐磨地板"},
         {price: 700, category: “衛浴"},
         {price: 400, category: “馬桶"}
     ];


    function render(data, category) {
         d3.select(“body").selectAll(“div.h-bar") //                  .data(data)
             .enter()
             .append(“div")
                 .attr(“class", “h-bar")
             .append(“span");


        d3.select(“body").selectAll(“div.h-bar") //                  .data(data)
             .exit().remove();


        d3.select(“body").selectAll(“div.h-bar") //                  .data(data)
             .attr(“class", “h-bar")
             .style(“width", function (d) {
                 return (d.price) * 0.6 + “px";}
             )
             .select(“span")
                 .text(function (d) {
                     return d.category;
                 });


        d3.select(“body").selectAll(“div.h-bar")
                 .filter(function (d, i) { //                      return d.category == category;
                 })
                 .classed(“selected", true);
     }


    render(data);


    function select(category) {
         render(data, category);
     }


    
         耐磨地板
    
    
         電動軌道
    
    
         壁紙
    
    
         取消選取
    


</body>


</html>


重點程式碼講解:

1. 程式碼註解 A ,我在這邊宣告了 一個 data 變數,它存放了一系列 json 格式的物件,該物件 有 2個屬性 分別為 price(記錄價格)、category(記錄類型)。

    var data = [ // <- 程式碼註解 A
        {price: 200, category: “捲簾"},
        {price: 300, category: “直立式軌道"},
        {price: 350, category: “木片百葉窗"},
        {price: 500, category: “木竹簾羅馬"},
        {price: 1000, category: “電動軌道"},
        {price: 800, category: “蜂巢簾"},
        {price: 900, category: “百葉窗"},
         {price: 500, category: “壁紙"},
        {price: 300, category: “耐磨地板"},
         {price: 700, category: “衛浴"},
         {price: 400, category: “馬桶"}
     ];

2.程式碼註解 B,透過 D3 的選取方式

d3.select(“body").selectAll(“div.h-bar").data(data).enter()

這行程式碼,透將會將 所有數據與 網頁的 <div id=’h-bar’> ,做交集的動作,使得每個數據可以對應各自的 <div id=’h-bar’> 元素。

3.程式碼註解 D,將選取的  <div id=’h-bar’> ,根據 data 的 price 價格 用公式來設定長度,以及透過 text() 來設定文字。

d3.select(“body").selectAll(“div.h-bar") // <- 程式碼註解 D
                 .data(data)
             .attr(“class", “h-bar")
             .style(“width", function (d) {
                 return (d.price) * 0.6 + “px";}
             )
            .select(“span")
                 .text(function (d) {
                     return d.category;
                 });

4.程式碼註解 E,也是最重要的,我根據 d3 支援的 filter()函數,來過濾要選擇的資料。

d3.select(“body").selectAll(“div.h-bar")
                 .filter(function (d, i) { // <- 程式碼註解 E
                     return d.category == category;
                 })
                .classed(“selected", true);

其他參考文章
HTML CSS 動畫教學–【軟體開發(軟件開發)】
繪圖程式-折線圖、區域圖 實作一
產品報告與能源曲線分析系統
利用 JavaScript D3 在網頁動態產生直條圖(軟體開發、軟件開發)
Java Script D3 資料過濾教學(軟體設計、軟體開發)
利用 JavaScript D3 在網頁動態產生直條圖(軟體開發、軟件開發)

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:
allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-5599-1310
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

【軟體開發、系統開發】多執行緒多任務存取相同變數,隔離保留各自任務的值 ThreadLocal 技術講解

      在講解幾篇關於多工、多執行緒、平行作業的技術文章後,想來談談另外一個深入的關鍵多多執行緒的問題,那就是多執行緒(多工)作業模式下,如何存取相同變數值,而且又希望各自的執行緒對相同變數又有各自的“值”。

      在 .Net 技術平台下,有個 ThreadLocal<T> 的泛型類別,這個類別可以專門用於有多個執行緒需要共同存取一個變數,但每個執行緒對這個變數的值,又個別記錄隔離儲存,互不影響。我舉個例子來說明,有執行緒A、執行緒B、執行緒C、執行緒D,這四個執行緒平行作業,將共同存取一個變數 X ,但在執行緒A存取變數X時,設定值為 10;執行緒B存取變數X時,設定值為 20;執行緒C存取變數X時,設定值為 30;執行緒D存取變數X時,設定值為 40; 在執行緒A設定 X變數值為 10時,並不會影響到 執行緒 B/C/D 各自設定的 X 變數值。

     一樣在此,我透過一個程式範例來進行實例說明,這個專案類型就簡單用 Console 控制台類型來引導…

完整程式碼如下:

namespace NetQna.Demo
{
     /// <summary>
     /// ThreadLocal 示範教學(網智數位-軟體開發)
     /// </summary>
     public class Program
     {
         /// <summary>
         /// 所有執行緒共同存取的變數值
         /// </summary>
         static ThreadLocal<int> X = new ThreadLocal<int>();


        static void ExecThreadTask(object obj)
         {
             ThreadEntity currThread = (ThreadEntity)obj;
             //在各自的執行緒環境設定 X 變數值,觀察各自的執行緒下,X 變數值各自記錄
             X.Value = currThread.ThreadValue;


            //顯示出 目前所在的執行緒 的值
             Console.WriteLine($"現在的執行緒 ID:{Thread.CurrentThread.ManagedThreadId},{nameof(X)}變數值為:{X.Value}。");
             //顯示出 目前所在的執行緒 的值
             Console.WriteLine($"現在的執行緒 名稱:{currThread.ThreadName},{nameof(X)}變數值為:{X.Value}。");
             Console.WriteLine();
         }


        static void Main(string[] args)
         {


            Dictionary<string, int> threadABCD = new Dictionary<string, int> { { “A", 10 }, { “B", 20 }, { “C", 30 }, { “D", 40 } };


            //分別啟動 A、B、C、D 執行緒,並執行 存取 X 變數值
             foreach (var t in threadABCD)
             {
                 ThreadEntity obj = new ThreadEntity { ThreadName = t.Key, ThreadValue = t.Value };


                //Action<string, int> action = ExecThreadTask(t.Key, t.Value);
                 Thread currThread = new Thread(ExecThreadTask);
                 currThread.Start(obj);


                //這邊我刻意停頓 1 秒,以利顯示各自執行緒
                 Thread.Sleep(1000);
             }


            Console.Read();


            X.Dispose(); //X 變數 釋放
         }


         public class ThreadEntity
         {
             public string ThreadName { get; set; }
             public int ThreadValue { get; set; }


        }
     }
}

程式說明講解

1

一開始我宣告一個屬性變數為 X ,也就是今天講解主要的類別 ThreadLocal,
待會就是用 這個 X 變數,來讓所有執行緒進行存取設定 X 變數值。


2

宣告一個帶有 object 參數的方法,待會就是要讓所有執行緒去各自執行這個方法,這個方法主要我將  object 型態 的 參數 obj 轉型為我自己宣告的類別 ThreadEntity 類別(PS:因為 Thread 建構子對應的方法的參數只能是 object 型態,所以我透過轉型來避開這限制)。

public class ThreadEntity
{
     public string ThreadName { get; set; }
     public int ThreadValue { get; set; }


}

最關鍵的地方,我在這個方法設定了各自執行緒要對應的 X 變數值

//在各自的執行緒環境設定 X 變數值,觀察各自的執行緒下,X 變數值各自記錄
X.Value = currThread.ThreadValue;

3

我這邊分別建立 A、B、C、D 四個執行緒,然後分別設定他們待會要指定 X 變數的值為(10、20、30、40)。

程式執行結果如下圖
d

可以看出 A、B、C、D執行緒各自維護自己 X 變數的值。


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

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

  在之前我寫過一篇關於用 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