現在合資SUV門檻越來越低了 質量好設計好 15萬以內就能落地_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

3廣汽菲克Jeep-自由

時下汽車市場對SUV的熱度是史無前例的,能夠有錢買路虎,買雷克薩斯固然是好,但是預算不多的朋友,想購買一輛SUV往往只能選擇售價十萬左右的小型SUV。事實上,省油、耐操,是國人對汽車的普遍需求,那小型SUV領域,這些合資車表現又如何呢?

1長安福特-翼博

指導價:9.48-12.78萬元

一句話:底盤好於預期,1.5L動力伐善可陳

翼博的造型給人短小精悍的感覺,正面看過去映入眼帘的是那個多邊形的大面積進氣格柵,彷彿與短小的車身不太協調,但是單看車頭的話確實是蠻大氣的。側面可以看到車身線條是稍微前傾的,下包圍是黑色塑料材質,顯得車身更高。車尾造型方正,外掛的備胎很有特色。

內飾中控和嘉年華如出一轍,中控面板微微斜傾,比較親近駕駛者,內飾主要是塑料材質,不太有高級感,但按鍵的質感並不差,中控有一個尺寸較小的單色屏,集成了SYNC多媒體系統,雖然不是最新的SYNC3,但是基本的多媒體功能還是能夠滿足的。

翼博搭載1.0T+5MT或者1.5L+5MT/6速雙離合的動力系統,最大馬力分別是125pS和110pS,1.5L版本的動力表現確實不太积極,而且13年上市的車型,雙離合的調校還未夠火候,低擋位的頓挫還是比較明顯。至於1.0T版本的動力就积極很多,1500轉左右就能感受到翼博已經活躍起來,只可惜沒有自動擋車型。

有人可能會擔心,翼博這個短而高的車身,會不會造成比較差的行駛穩定性?然而事實並不是,翼博的高速穩定性十分出色,

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

甚至超出了同級別的水準。高速併線時車身十分穩定,可以感受到翼博的懸挂質感十分紮實,整體調校是偏舒適的。

2東風標緻-2008

指導價:9.97-16.37萬元

一句話:內飾做工有待提升,行駛品質驚喜滿滿

標緻2008造型圓潤,車身姿勢較低,外形看起來更加偏向於一輛跨界車。前臉造型比較含蓄,鍍鉻中網沒有使用大口式設計,車標也被放在了引擎蓋上,這也是標緻上一代車型比較普遍的一個設計。側面造型看起來更像一輛跨界車了,還能看到尾燈位置有一個“C”字造型,很有設計感。

2008的內飾簡潔內斂而不是時尚感,整體氛圍十分和諧。內飾面板分上下兩層,分別是硬質塑料盒軟質的織物材料,手觸及的地方都是柔軟的。只是內飾在做工上還是有不完美的地方,如空調的旋鈕,天窗控制區乾脆的塑料板,在做工上都不夠好。

動力方面,標緻2008搭載1.2T、1.6L和1.6T的發動機,自吸版本的變速箱為4AT,渦輪版本的變速箱為6AT,不怕老實說,最推薦的還是1.2T的車型,136pS的馬力,放棄了老舊的4AT,無論是動力表現、燃油經濟性,還是性價比,都是三個排量裏面最好的,家用足夠,平時代步也不會十分寒酸。

底盤和轉向的調校一直都是法系車的強項,我們確實不用擔心。標緻2008的懸挂調校偏向舒適,但並不是那種無底線的柔軟,在支撐性方面也有一定的表現,整體操控雖然不能說是指哪打哪,但是併線和轉彎的時候絲毫不用擔心會有嚴重的側傾,家用車有這個行駛品質,算是很不錯的了。

3廣汽菲克Jeep-自由本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

最低只需12萬起 五款入門小鋼炮怎麼選?_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

雷諾在性能上的摸索研究,一點都不比別的車廠差。梅甘娜RS也是一輛在車迷圈子內名聲頗大的鋼炮。就因為它曾在紐北創造了前驅車最速紀錄,這就已經為梅甘娜RS蒙上一層神聖的面紗。不過這台車又是叫好不叫座,據聞在國內能以低於30萬的價格收到一台。

不少車迷心裏都會有一個鋼炮夢,他們喜歡的這些鋼炮車型,兩廂的車身造型緊湊得像顆子彈,又能提供比較出色的駕控體驗。今天就來給大家聊聊五台比較有代表性,又能買得到的鋼炮車型。

很意外,雨燕居然上榜了。這台在國內曾經滿大街跑小兩廂,嚴格來說還不算鋼炮。但自從聽說了以前的高中同學花了兩萬淘了輛二手雨燕,換了個排氣管后就搖着棍棍去跑山了,我這才意識到這小傢伙是多麼的充滿樂趣。

然而這台雨燕Sport是台進口車…售價要13萬左右,想想還是來台二手的比較實際。

福特造的小車一向口碑不錯,就比如這台N年沒改過款的兩廂小鋼炮嘉年華ST。1.6T發動機帶着180馬力的輸出送你上路,加上很鍛煉人意志力的六擋手動變速箱,足以讓你整天把駕駛樂趣掛在嘴邊了。

買這台車之前,

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

可能你得想好一個理由來說服家人為什麼買一台起步價要18萬的嘉年華..

雷諾在性能上的摸索研究,一點都不比別的車廠差。梅甘娜RS也是一輛在車迷圈子內名聲頗大的鋼炮。就因為它曾在紐北創造了前驅車最速紀錄,這就已經為梅甘娜RS蒙上一層神聖的面紗。

不過這台車又是叫好不叫座,據聞在國內能以低於30萬的價格收到一台。

福特的鋼炮小車子,今年的代表作必定是這台藍得發紫的福克斯RS了。而它也具備了叫板像寶馬M2、思域Type R這類車型的實力。加上一鍵飄移模式,簡直就是把遊戲機搬到了這台車上。對於粉絲來說,得到它就像得到了全世界。

同樣的,買這輛車的盆友可能也要考慮一下向家人解釋為什麼花40萬來買輛福克斯了..

最後一台車,是奔馳的A45 AMG。這台純正的AMG車型,我們才在前陣子試駕過,確實是一輛剛猛的小鋼炮,夠鋼,也能打炮(說的是排氣管放炮聲)。高達380馬力的動力輸出,已經能在天朝當路霸了。

16款的A45 AMG起售價59萬,加個十萬左右就能買最新的保時捷718 Boxster了,這樣一想,還真是讓人糾結啊。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

逼格有多高?關鍵看車門!這些車門我能玩一年!_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

馬自達RX-8使用對開門的初衷和寶馬i3較為相似,主要是為了方便乘客進入後排座椅,不過即使是再怎麼方便,相信也沒幾個人願意坐在RX-8的後排。鷗翼式車門向300 SL Gulling致敬的奔馳SLS-AMG,僅靠鷗翼式車門就能夠收集眾人的目光,雖然鷗翼門非常炫酷,但是日常的使用當中難免會顯得麻煩,看門前要觀察上下左右各個方位,確保有足夠空間才能夠開門。

《女子騎車突遇汽車開門:被撞倒地遭碾壓身亡》、《騎車男子遭前方車輛開門撞倒 又被公交碾壓》類似這樣的新聞幾乎每個月都能夠看見,每次看到這樣的新聞都會不禁感嘆,為什麼這麼多血的教訓擺在面前,都不懂得珍惜生命。

其實在現實中,有很多人都是沒有觀察後方路況就隨意開門的,只不過是運氣好,沒有發生意外而已。無論是在路上開車還是騎車走路,我們都要對停在路邊的車輛額外注意,盡量遠離車門,真的可能隨時來一個謀殺式的開門。

在路邊停車后開門下車前,一定要觀察後方路況,這樣的話都不知道說了多少千百遍了,既然大家都不放在心上,那麼我們也就不管了(就是這麼任性),我們來看看車門的“藝術”吧。

1989年,寶馬推出了一款很特別的跑車-寶馬Z1,它擁有着隱藏式的車門,開門時通過伸縮的方式隱藏在車身內,這樣的車門結構,能夠從源頭降低發生意外的幾率,可惜這輛神奇的寶馬Z1總共才生產了8000輛,並且只在德國和美國銷售,估計現在存活的已經很少,並且都是在收藏家手中了。

對開式車門有着“自殺式車門”的稱號,經常被人調侃,主要都是說車輛行駛當中後車門無意打開會發生怎樣怎樣的情況,其實廠家也會想到這些情況,在開門邏輯與安全性上都不斷在優化。

勞斯萊斯一直在堅持使用對開式車門,賦予了對開式車門優雅的調性,而不是什麼炫酷,據說勞斯萊斯的對開門設計,

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

還有隱藏在車門內的雨傘,就是為了女星門走紅毯設計的,能夠提供一個相對私密的空間方便下車。

寶馬i3的對開門設計非常激進,取消了車輛B柱的設計,直接用車門車門作為支撐,i3的對開門最主要目的是方面後排乘客上下車,並且有利於提供更大的車廂空間。

馬自達RX-8使用對開門的初衷和寶馬i3較為相似,主要是為了方便乘客進入後排座椅,不過即使是再怎麼方便,相信也沒幾個人願意坐在RX-8的後排。

向300 SL Gulling致敬的奔馳SLS-AMG,僅靠鷗翼式車門就能夠收集眾人的目光,雖然鷗翼門非常炫酷,但是日常的使用當中難免會顯得麻煩,看門前要觀察上下左右各個方位,確保有足夠空間才能夠開門。

如果要問什麼是鷗翼門的終極形態,那麼就不得不說到特斯拉-MODEL X了,電動開啟的鷗翼門,能夠通過傳感器探知周圍情況,從而調整車門開啟角度,即使是狹窄的空間也能夠開啟車門。

剪刀門一直都是蘭博基尼的慣用伎倆,就像是傳統文化一樣,兩者不可分離。剪刀門改裝文化也十分博大精深,改裝剪刀門也不用付出高昂的費用,所以在很多改裝車展、聚會上都能夠看見。

既像鷗翼門,也像剪刀門,將兩者融合之後,就是蝴蝶門。法拉利的靈魂-法拉利ENZO就是使用蝴蝶門,還有速度怪獸LaFerrari、奔馳SLR、邁凱倫p1。

不知道將科尼賽克-Agera的車門稱之為旋轉式車門合不合適,反正它不是隱藏式,不是對開式,不是鷗翼式,不是蝴蝶門,也不是剪刀門,非常特別,打開車門后,整個車門就像是擰瓶蓋一樣旋轉出來。

雖然這種旋轉式車門不需要很大的垂直空間,但是一定要非常留意橫向空間,千萬不要靠近馬路牙子,因為車門打開后就像是放在地上一樣,離地間隙很小。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

為何你們買國產車只看SUV 中國汽車只能靠SUV嗎?_台中搬家公司

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

對於正在實現品牌爬升的自主品牌而言,無疑是不利的因素。在國內某著名數據調研機構發布的《自主品牌車主忠誠度調查》報告中,僅有31。2%的自主品牌用戶表示願意在增購、換購車輛時繼續選擇自主品牌。這類“放一槍換一地”思維下誕生的SUV車型,無疑是導致這一結果的主因之一。

《雙城記》里有這樣的一句名句:這是最好的時代,這也是最壞的時代。如今,這句話套用在自主品牌身上更是顯得尤為合適。一方面,自主品牌在今年前8月,累計銷量共計610萬輛,佔到了整個國內汽車市場份額的42.2%。而另一方面,我們卻也看到,這42.2%的市場份額,有過半都是靠10萬元(以及10萬元以下)的SUV所堆砌出來的。

SUV對於自主品牌而言,是一股前所未有的曙光。數據显示,今年上半年,自主品牌SUV共銷售217萬輛,同比增長52.3%,佔到了國內SUV總銷量的56.4%。賣SUV,已經成為目前自主品牌最重點的發展方向。哪怕是沒有任何技術積澱的廠商,也要通過“復刻”國外成熟的SUV車型造一輛SUV。但在這大好的形勢當中,自主品牌也被SUV帶到了前所未有的憂患當中,甚至是將來的萬劫不復。

毫無意外,今年8月,SUV賣得最好的車企又是長城,而長城賣得最好的SUV又是哈弗H6。稍稍對汽車行業關心的人,都對這一現象再熟悉不過。自從哈弗H6在5年前上市,長城汽車便已經跟SUV這個詞糅雜在了一起,不可分離。憑藉SUV在整個品牌中高達80%的銷量佔比(24.03萬輛),長城汽車再度取得了今年上半年自主品牌SUV銷量冠軍的寶座。同時,也讓長城汽車成為銷量前十車企的第九位。

此外,上市僅一年半時間,被譽為“爆款”的廣汽傳祺GS4同樣為廣汽帶來了可觀的收益。在整個上半年,廣汽傳祺GS4共銷售15.1萬輛,佔到了廣汽傳祺整個品牌銷量的90%(16.6萬輛)。可以說,GS4之於廣汽傳祺,就等於哈弗H6之於長城,兩者都是關係到品牌銷量命脈的關鍵因素。

這種SUV的熱度不僅為長城、廣汽傳祺這樣的一線自主品牌帶來了銷量的轉變,許多二、三線的自主品牌同樣得到了翻身的機會。在上半年,依靠紳寶X25、紳寶X35實現銷量同比增長94%的北汽紳寶;依靠瑞風S3,奪得2015年單一SUV銷量季軍的江淮汽車等等。“只要賣SUV就能掙錢,”已經成為了自主品牌們的一種共識。

但儘管SUV讓自主品牌實現了做大的目標,但卻沒有實現從量變到質變的過渡,許多的車企(包括一線自主品牌)往往採取的是“放一槍換一地”的銷售策略。在發動機、裝配工藝等產品質量上,

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

仍然與主流合資品牌存在着較大的差距。在相關汽車投訴網站上,自主品牌SUV往往因變速箱異響、發動機異響、吃胎偏磨等投訴而佔據了投訴榜單的前列。對於正在實現品牌爬升的自主品牌而言,無疑是不利的因素。

在國內某著名數據調研機構發布的《自主品牌車主忠誠度調查》報告中,僅有31.2%的自主品牌用戶表示願意在增購、換購車輛時繼續選擇自主品牌。這類“放一槍換一地”思維下誕生的SUV車型,無疑是導致這一結果的主因之一。全國乘用車聯席會秘書長崔東樹曾表示:“如果不是中低端SUV熱賣,自主品牌市場佔有率極有可能下跌。”事實上,崔樹東的判斷在市場上早有一定的應驗。

由於自主品牌SUV產品的不斷湧入,不少的自主品牌已經開始在SUV市場舉步維艱。尤其在自主品牌的主力戰場—10萬元區間,這種競爭更顯激烈。像机械部分完全相同的北汽紳寶X25與昌河Q25,就僅僅在外觀、內飾的設計上有所不同。也正因為不同品牌間或是同品牌間SUV產品的同質化加劇,價格就愈發成為影響產品競爭力的因素。

在今年的3月,長城發布了哈弗H6的升級版車型,在增加配置的同時,進一步降低了售價。因此,雖然哈弗H6在上半年仍然保持了39.7%的同比增幅,但實質在整車利潤上卻沒有得到有效的提升。根據長城汽車公布的上半年盈利數據,相比起哈弗H6上半年銷量39.7%的同比增幅,長城汽車上半年的凈利潤同比僅增長4.4%,遠沒有跟上銷量的增長幅度。而在長城之後,長安CS75、傳祺GS4等直接的競爭車型也紛紛採取降低保量的措施。

但長城汽車已經是稱得上幸運的,因為與長城比起來,被譽為2015年“最大的黑馬”的江淮汽車受SUV市場的影響,銷量的衰退幾乎是顛覆性的。

奪得2015年SUV年度銷量季軍的瑞風S3,自今年4月以來,連續3個月跌出SUV銷量榜前十位。而8月當月的銷量,更只有4989輛,同比下跌高達65%。截止今年8月,瑞風S3的累計銷量為11.3萬輛,排在SUV榜單的第8位。

受到瑞風S3銷量下跌的影響,江淮汽車上半年的營業虧損高達11.14億元,營業虧損程度僅次於一汽夏利。若非依靠18億的政府新能源補貼,江淮汽車將陷入全盤虧損的狀態。

瑞風S3定位6-10萬級小型SUV,而這一價位市場自進入2016年以來,不斷有昌河Q25、長安CS15等同級競爭車型的加入。就連在尺寸上高一級的長安CX70、北汽幻速S3也紛紛進入這個價位進行競爭。在本來單車利潤較低的情況下,再遇到同級以及高一級車型的競爭,瑞風S3的銷量下滑就成了不可避免的事情。

對於SUV這塊自主品牌眼中的香餑餑,有分析人士認為,隨着市場消費結構逐漸趨於合理以及合資品牌中低端SUV的全線鋪開,自主品牌SUV目前的大額市場份額將難以保持。SUV在早期幫助自主品牌完成資本積累的同時,也帶來了經營上的巨大風險。無論是降價的哈弗H6,還是虧損的瑞風S3,我們都能夠看到這種風險信號的釋放。能否儘早擺脫過渡依賴SUV市場,將會是自主品牌能否得以持續發展的關鍵。

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

你一定不知道!白富美最愛小車在國外僅僅只是用來買菜_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

真正的初代甲殼蟲——大眾Type 1,在戰後的1946年才得以重新量產並且投入民用。隨後的數十年甲殼蟲成為了熱銷車型的代名詞,在1972年前後,甲殼蟲超越率先開展流水線生產的福特T型轎車成為全球銷量最高的轎車。設計簡單,品質耐用的大眾甲殼蟲讓眾多消費者異常喜愛,直至二十一世紀初,甲殼蟲的累計產量已經超過兩千萬台。

甲殼蟲,大眾品牌旗下知名度極高的車型,在國內擁有甲殼蟲的車主一般非富即貴。動輒三十多萬的售價在國內甚至可以接觸到BBA級別的豪華品牌,但或許你並不知道,這款深得國內白富美女性車主喜愛的小型座駕其實在德國僅僅是一台買菜級的小車。

大眾(進口)甲殼蟲

指導價格:19.18-33.00萬

首先得說說大眾這個品牌,大眾的德文Volkswagen直譯過來便是“人民汽車”;1933年戰爭狂人希特勒當選成為德國總理,國民汽車計劃的構想也應運而生,有着同樣的“人民汽車”計劃的費迪南德-波爾舍博士則成為了大眾汽車的功勛設計師。

甲殼蟲這款車不是大眾集團旗下最昂貴的,但是身份絕對是最尊貴的,1937年,德國大眾汽車公司成立,1938年,大眾汽車開始生產第一款車型——KdF-Wagen。這款以“快樂就是力量(KdF)”命名的轎車便是後來的甲殼蟲(Beetle)。

由於二戰,原本設立生產KdF汽車的工廠以及KdF車型都被轉為軍事用途,民眾並沒有機會享受到用車的幸福。真正的初代甲殼蟲——大眾Type 1,在戰後的1946年才得以重新量產並且投入民用。

隨後的數十年甲殼蟲成為了熱銷車型的代名詞,在1972年前後,

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

甲殼蟲超越率先開展流水線生產的福特T型轎車成為全球銷量最高的轎車。設計簡單,品質耐用的大眾甲殼蟲讓眾多消費者異常喜愛,直至二十一世紀初,甲殼蟲的累計產量已經超過兩千萬台。

編輯總結:甲殼蟲其實在德國就是以廉價為特點的車型,這也成為外國特別是歐洲國家家庭用戶首選車型之一,但是在汽車普及相對較晚的中國,車身尺寸小,而且雙門設計的甲殼蟲並不適應國內群眾的用車訴求,而成為國內人民群眾廣泛接受的車型是當年的捷達以及桑塔納。

到目前為止,甲殼蟲依舊採取的是純進口的方式在國內進行銷售,現款的甲殼蟲依舊保持了當年初代甲殼蟲應該有的特點,三門掀背以及敞篷的設計,讓甲殼蟲成為了很多追求用車個性化人士的青睞之選。

現在國內的甲殼蟲普遍是作為有車家庭的第二台車,而且駕駛的基本上是以女性車主居多,的確,操控輕便敏捷,外觀設計圓潤可愛的高顏值的確很受女車主的喜愛。

其實小編個人還是對於甲殼蟲國產化有着那麼一絲期待,畢竟在當今的中國汽車消費市場,購車人群年輕化,車型選擇個性化的趨勢已經越來越明顯。這麼一款年輕人普遍抱有好感,但是由於售價比肩大多數合資B級車的個性化轎車,還是讓人有些望而卻步。

pS:上文所提及的“KdF”是德國勞工聯盟旗下所屬的一個度假組織的名稱,以此為甲殼蟲的原型車命名,也是證明了當時德國大眾汽車公司對於該款車型的定位就是想讓其成為全國人民每人都買得起、用得上的汽車;工業化時代下的人民生活,汽車的普及是每一個國家每一個家庭幸福指數得以提高的重要表現。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

蒙古爆發鼠疫 傳已死2人封城 外國遊客禁離境_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

摘錄自2019年5月5日自由時報報導

蒙古國傳爆發鼠疫,其中傳出鼠疫的烏列蓋市已有2人死亡,全城封閉檢疫,以致在當地旅遊外國遊客全被禁止回國。

《俄羅斯通訊社》報導,最初傳出爆發鼠疫訊息的是一個叫 vesti.ru網站,接著,俄羅斯駐蒙古大使館證實這個訊息。

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

綜合媒體報導,這場瘟疫初步認定是由當地土撥鼠傳播,已有2人死亡,其中,有人在醫院內死亡,以致在4月30日至5月1日夜裡,爆發鼠疫的烏列蓋市全城封閉檢疫,有外國遊客恐慌想要離城返國,即被禁止,也因此外傳鼠疫爆發事件;蒙古國宣布,檢疫將到今天(5月5日),是否繼續封城檢疫,還沒有進一步消息。

西伯利亞媒體也指出,蒙古人有生吃老鼠腎臟的傳統,認為會健康,每年都會發生鼠疫,並非新的疾病。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

觀察者模式_台北網頁設計

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

觀察者模式簡述

觀察者(Observer)模式的定義:指多個對象間存在一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。這種模式有時又稱作發布-訂閱模式、模型-視圖模式,它是對象行為型模式。

觀察者模式結構與實現

 實現觀察者模式時要注意具體目標對象和具體觀察者對象之間不能直接調用,否則將使兩者之間緊密耦合起來,這違反了面向對象的設計原則。

觀察者模式主要結構如下:

  • 抽象主題(Subject)角色:也叫抽象目標類,它提供了一個用於保存觀察者對象的聚集類和增加、刪除觀察者對象的方法,以及通知所有觀察者的抽象方法。
  • 具體主題(Concrete    Subject)角色:也叫具體目標類,它實現抽象目標中的通知方法,當具體主題的內部狀態發生改變時,通知所有註冊過的觀察者對象。
  • 抽象觀察者(Observer)角色:它是一個抽象類或接口,它包含了一個更新自己的抽象方法,當接到具體主題的更改通知時被調用。
  • 具體觀察者(Concrete Observer)角色:實現抽象觀察者中定義的抽象方法,以便在得到目標的更改通知時更新自身的狀態。

uml圖如下:

 

 觀察者模式代碼實現如下:

/**
 * 抽象主題(被觀察角色)
 */
public abstract class Subject{
    //觀察者list集合(聚集對象)
    protected List<Observer> observerList=new ArrayList<Observer>();
    //註冊觀察者
    public void addObserver(Observer observer){
        observerList.add(observer);
    }
    //刪除觀察者
    public void removeObserver(Observer observer){
        if(observerList.contains(observer)){
            observerList.remove(observer);

        }
    }
    //通知觀察者
    public abstract void notifyObserver();
}

/**
 * 具體主題角色類(被觀察的類)
 */
public class ConcreteSubject extends Subject{
    @Override
    public void notifyObserver() {
        System.out.println("被觀察者發現變化了...");
        for(Observer observer:super.observerList){
            observer.update();
        }

    }
}

/**
 * 抽象觀察者
 */
public interface Observer {
    public void update();
}


/**
 * 具體觀察者類
 */
public class ConcreteObserver1 implements Observer {
    @Override
    public void update() {
        System.out.println("observe1 更新了");
    }
}

/**
 * 具體觀察者
 */
public class ConcreteObserver2 implements Observer {
    @Override
    public void update() {
        System.out.println("observer2 發生變更");
    }
}


/**
 * 客戶端測試類
 */
public class ObserverClient {
    public static void main(String[] args) {

        Subject subject=new ConcreteSubject();
        Observer observer1=new ConcreteObserver1();
        Observer observer2=new ConcreteObserver2();
        subject.addObserver(observer1);
        subject.addObserver(observer2);
        //具體主題發生變化通知觀察者。
        subject.notifyObserver();

    }
}

觀察者模式案例

1.利用觀察者模式設計一個程序,分析“人民幣匯率”的升值或貶值對進口公司的進口產品成本或出口公司的出口產品收入以及公司的利潤率的影響。

分析:。被觀察的抽象主題對象就是匯率Rate,以人民幣匯率RMBRate為具體主題。以公司Company為抽象觀察者,出口公司ExportCompany為具體的觀察者,進口公司ImportCompany為具體的觀察者,人民幣匯率(具體主題角色)升值時,進口公司(具體觀察者對象)的進口產品成本降低且利潤率提升,出口公司(具體觀察者對象)的出口產品收入降低且利潤率降低;當人民幣匯率貶值時,進口公司的進口產品成本提升且利潤率降低,出口公司的出口產品收入提升且利潤率提升。總而言之當主題角色匯率發生變化時,觀察者Company的利潤也相應發生變化。

uml圖如下:

 

 代碼實現如下:

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

/**
 * 抽象觀察者
 */
public interface Company {
    void update(int changeRate);
}

/**
 * 具體觀察者進口公司ExportCompany
 */
public class ExportCompany implements Company {
    @Override
    public void update(int changeRate) {
        if(changeRate>=0){
            System.out.println("人民幣匯率升值"+changeRate+"個基點,降低了進口產品成本,提升了進口公司利潤率");

        } else {
            System.out.println("人民幣匯率貶值"+(0-changeRate)+"個基點,提升了進口產品成本,降低了進口公司利潤率。");

        }
    }
}


/**
 * 具體觀察者進口公司importCompany
 */
public class ImportCompany implements Company {
    @Override
    public void update(int changeRate) {
        if(changeRate>=0){
            System.out.println("人民幣匯率升值"+changeRate+"個基點,降低了進口產品成本,提升了進口公司利潤率");

        } else {
            System.out.println("人民幣匯率貶值"+(0-changeRate)+"個基點,提升了進口產品成本,降低了進口公司利潤率。");

        }
    }
}

/**
 * 抽象主題角色
 */
public abstract class Rate {
    //觀察者company對象list集合
    protected List<Company> companyList=new ArrayList<Company>();
    //增加觀察者company對象
    public void addObserver(Company company){
        companyList.add(company);
    }
    //刪除觀察者company對象
    public void removeObserver(Company company){
        companyList.remove(company);
    }
    public abstract void change(int rateChange);
}

/**
 * 具體主題對象人民幣匯率RMBRate
 */
public class RMBRate extends Rate {

    @Override
    public void change(int rateChange) {
        for (Company company:super.companyList){
            company.update(rateChange);
        }
    }
}
/**
 * 匯率變化觀察者模式實現客戶端類
 */
public class RateClient {
    public static void main(String[] args) {
        //具體觀察對像進口公司
        Company importCompany=new ImportCompany();
        //具體觀察者對象出口公司
        Company exportCompany=new ExportCompany();
        //具體主題角色人民幣對象
        Rate rmbRate=new RMBRate();
        //增添觀察者對象
        rmbRate.addObserver(importCompany);
        rmbRate.addObserver(exportCompany);
        //匯率提升
        rmbRate.change(2);
        //匯率降低
        rmbRate.change(-3);
    }
}

2.事件監聽模式就是利用觀察者模式實現的,java的awt窗體程序就是用觀察者模式實現的,在軟件幵發中窗體程序,界面程序都是基於事件監聽模式實現。現在以awt的Button的點擊事件為例,來了解一下事件監聽模式。首先創建一個按鈕Button類(事件源對象,被觀察者對象),將按鈕點擊監聽器註冊在Button上,當用戶點擊按鈕時,會產生一個按鈕點擊事件 ButtonClickEvent,將點擊事件傳給按鈕點擊監聽器 ButtonClickListener,監聽器做出相應的動作。

uml圖如下:

 代碼實現如下:

/**
 * 自定義按鈕類,事件源對象
 */
public class Button {
    private String buttonName;

    protected List<Listener> listenerlist = new ArrayList<Listener>();
    //註冊監聽器
    public void addListener(Listener listener){
        listenerlist.add(listener);
    }
    //移除監聽器
    public void removeListener(Listener listener){
        listenerlist.remove(listener);
    }
    //點擊方法
    public void press(){
        ButtonClickEvent event=new ButtonClickEvent(this);
        for (Listener listener:listenerlist){
            listener.actionPerformed(event);
        }
    }

    public String getButtonName() {
        return buttonName;
    }

    public void setButtonName(String buttonName) {
        this.buttonName = buttonName;
    }
}

package cn.ck.observer.v4;


import java.util.EventObject;

/**
 * 按鈕點擊事件
 */

public class ButtonClickEvent extends EventObject {
   private Object source;
public ButtonClickEvent(Object source){ this.source=source; } } /** * 抽象監聽器 */ public interface Listener { public void actionPerformed(ButtonClickEvent event); } /** * 按鈕點擊監聽器 具體觀察者 */ public class ButtonClickListener implements Listener { @Override public void actionPerformed(ButtonClickEvent event) { Button button= (Button) event.getSource(); System.out.println(button.getButtonName()+"按鈕被點擊了..."); } } /** * 按鈕事件測試類 */ public class ButtonClient { public static void main(String[] args) { Button b1=new Button(); Listener listener=new ButtonClickListener(); b1.setButtonName("button1"); Button b2=new Button(); b2.setButtonName("button2"); b1.addListener(listener); b2.addListener(listener); b1.press(); b2.press(); } }

jdk的觀察模式通過 java.util.Observable 類和 java.util.Observer 接口定義的,只要實現它們的子類就可以編寫觀察者模式實例。

1. Observable類

Observable 類是抽象目標類,它有一個 Vector 集合,用於保存所有要通知的觀察者對象,下面來介紹它最重要的 3 個方法。

  1. void addObserver(Observer o) 方法:用於將新的觀察者對象添加到向中Vector集合(線程安全)。
  2. void notifyObservers(Object arg) 方法:調用Vector集合中的所有觀察者對象的 update。方法,通知它們數據發生改變。通常越晚加入向量的觀察者越先得到通知。
  3. void setChange() 方法:用來設置一個 boolean 類型的內部標誌位,註明目標對象發生了變化。當它為真時,notifyObservers() 才會通知觀察者。

2. Observer 接口

Observer 接口是抽象觀察者,它監視目標對象的變化,當目標對象發生變化時,觀察者得到通知,並調用 void update(Observable o,Object arg) 方法,進行相應的工作。

還是以上面匯率的例子為例,用jdk的抽象觀察者,抽象目標類實現觀察者模式,具體代碼如下:

/**
 * 具體主題對象人民幣匯率RMBRate
 */
public class RMBRate extends Observable{

    public void change (int rateChange) {
        //changed變成true
        super.setChanged();
        super.notifyObservers(rateChange);
    }
}


/**
 * 具體觀察者進口公司ExportCompany
 */
public class ExportCompany implements Observer{

    @Override
    public void update(Observable o, Object arg) {
        int changeRate= (int) arg;
        if(changeRate>=0){
            System.out.println("人民幣匯率升值"+changeRate+"個基點,降低了進口產品成本,提升了進口公司利潤率");

        } else {
            System.out.println("人民幣匯率貶值"+(0-changeRate)+"個基點,提升了進口產品成本,降低了進口公司利潤率。");

        }

    }
}

/**
 * 具體觀察者進口公司importCompany
 */
public class ImportCompany implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        int changeRate= (int) arg;
        if(changeRate>=0){
            System.out.println("人民幣匯率升值"+changeRate+"個基點,降低了進口產品成本,提升了進口公司利潤率");

        } else {
            System.out.println("人民幣匯率貶值"+(0-changeRate)+"個基點,提升了進口產品成本,降低了進口公司利潤率。");

        }

    }
}


/**
 * 匯率變化觀察者模式實現客戶端類
 */
public class RateClient {
    public static void main(String[] args) {
        //具體觀察對像進口公司
        Observer importCompany=new ImportCompany();
        //具體觀察者對象出口公司
        Observer exportCompany=new ExportCompany();
        //具體主題角色人民幣對象
        RMBRate rmbRate=new RMBRate();
        //增添觀察者對象
        rmbRate.addObserver(importCompany);
        rmbRate.addObserver(exportCompany);
        //匯率提升
        rmbRate.change(2);
        //匯率降低
        rmbRate.change(-3);

    }
}

觀察者模式優點與缺點

1.觀察者模式優點

  • 降低了目標與觀察者之間的耦合關係,兩者之間是抽象耦合關係。
  • 目標與觀察者之間建立了一套觸發機制。

2.觀察者模式缺點

  • 目標與觀察者之間的依賴關係並沒有完全解除,而且有可能出現循環引用(可以通過事件類引用一個目標對象解決這個問題)。
  • 當觀察者對象很多時,通知的發布會花費很多時間,影響程序的效率。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

不可不知的輔助測試的Fiddler小技巧,Fiddler抓包工具使用詳解,利用Fiddler攔截接口請求並篡改數據,Fiddler使用過程中容易忽略的小技巧,Mock測試,結合Fiddler輕鬆搞定不同場景_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

在以前的博文中,時常有分享Fiddler的一些使用技巧,今天再貼下。

Fiddler抓包工具使用詳解

利用Fiddler攔截接口請求並篡改數據

Fiddler使用過程中容易忽略的小技巧

Mock測試,結合Fiddler輕鬆搞定不同場景

以上這些,就是以前的一些實踐總結。今天,再來分享一個不可不知的小技巧,實際工作當中,是可以輔助自己完成測試的。

模擬弱網

相信大家在進行測試過程中,都會關注到弱網測試。web端是可以通過瀏覽器的開發者工具中的Network設置網絡數據,app端也可以通過切換網絡的形式來進行測試。

其實,Fiddler也是支持模擬弱網測試的。通過Fiddler設置后,web和app都可以一併模式。

固定延遲設置方式

啟動Fiddler工具>找到FiddlerScript頁簽>按m_SimulateModem搜索。

找到如下所示內容【限速函數】,修改參數即可:

修改代碼中的參數,將300修改為3000,也就是3S,如下:

if (m_SimulateModem) {
            // Delay sends by 300ms per KB uploaded.
            oSession["request-trickle-delay"] = "3000"; 
            // Delay receives by 150ms per KB downloaded.
            oSession["response-trickle-delay"] = "150"; 
        }  

此時,保存修改后的Script代碼即可,如下所示:

數據保存后,如何使其生效呢?按如下操作即可。

在Fiddler中,按如下路徑配置即可:Rules>Performance>Simulate Modem Speeds。

具體操作,如下圖所示:

此時,再刷新頁面,我們可以從Fiddler面板中的Time參數看出,每個接口的響應時間都延時3s,如下所示:

網絡延遲時間如何計算?

比如你要模擬上傳速度100KBps的網絡,那上傳延遲就是1KB/100KBps=0.01s=10ms,就改成10。

隨機延遲設置方式

我們從上述操作看出,配置限速參數后,每個接口都是固定的延遲時間。但實際使用場景中,這種情況是比較少的。基本上都是有時快,有時慢的情況。那是否可以設置隨機延遲呢?答案肯定是可以的。我們繼續來看。

我們依然在FiddlerScript頁簽中操作,加入如下代碼,代碼如下所示:

static function randInt(min, max) {
  return Math.round(Math.random()*(max-min)+min);
  }
  if (m_SimulateModem) {
  // Delay sends by 300ms per KB uploaded.
  oSession["request-trickle-delay"] = ""+randInt(1,2000);
  // Delay receives by 150ms per KB downloaded.
  oSession["response-trickle-delay"] = ""+randInt(1,2000);
  }  

保存修改后的代碼,並重新啟用配置即可。

模擬發包

測試過程中,想模擬一個接口請求,一般是通過Postman、Jmeter、soupUI,常用的是Postman。我們Fiddler能不能模擬接口請求呢?這個是可以的,我們來看。

我們切換到Composer頁簽,如下所示:

從圖中可知,是可以模擬很多種請求方式的。我們就來實際操作一番。

POST請求

我們先來操作個POST請求,選擇POST請求方式,填寫接口與參數如下:

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

接口與參數填寫正確后,點擊右上角的Execute按鈕即可請求接口。我們來看下請求數據:

我們先來看請求頭,接口請求頭中的User-Agent參數,如下所示:

用戶代理來源是Fiddler,就是剛才我們通過Fiddler工具請求的數據。

我們再來看響應,接口請求成功,正常響應並獲取到token數據,如下所示:

GET請求

剛才操作的是POST請求,現在來看個GET請求。操作方式都一樣,將請求方式切換成GET,填寫接口與參數,並點擊Execute按鈕,配置如下所示:

我們依然來看接口數據,先看請求頭參數:

 

User-Agent參數依然是Fiddler,說明是從Fiddler工具中發出的請求。

再來看響應數據,如下所示:

以上就是通過Fiddler模擬請求POST和GET請求了,其他方式類似。

模擬併發

在我們測試中,也會關注到,一個接口同時請求多次,會不會產生錯誤,比如:重複數據。那這次就需要考慮併發情況了。

Fiddler工具依然還是支持該操作,具體如下:

我們先選中已抓取的任一接口,點擊右鍵,並選擇Replay>Reissue Sequentially,也可以快捷鍵【Shift + R】如下所示:

點擊后,會彈出如下彈框,設置請求次數,如下所示:

默認是5,那我們改成3,並點擊OK按鈕,來看界面,如下所示:

我們可以看到,同時請求了3次,簡單模擬了併發測試,但實際是不及Jmeter工具的,畢竟這個也只是模擬,而Jmeter要專業許多。

了解完了併發使用,但還有些其他參數沒有介紹,我們來了解下其他參數,說不準以後也有用途。如下所示:

  • Reissue Requests:重發選中的請求
  • Reissue Unconditinally:無條件重發選中的請求
  • Reissue and eidt:重發並編輯,會打開一個加了斷點的請求,可以進行請求和響應數據的修改
  • Reissue and verify:重發並驗證,重新發送請求,並驗證其請求結果,會自動加標識(背景顏色)
  • Reissue Sequentially:重發序列,打開一個數量設置界面,標識需要重發多少次請求
  • Reissue from Composer:重發並打開composer界面,可以編輯或發送
  • Revisit in IE:在IE上發起這個請求

問題總結

在使用Fiddler模擬請求發包時,有時會操作失敗,比如通過百度查詢數據,GET接口,有時Caching參數不帶private參數就響應了302,正常帶該參數,是可以響應成功的,如下所示:

不知為何會出現,不帶該參數的情況。有遇到的博友,望提點一二。

 

好了,今天的這三個Fiddler技巧,就分享到這了,個人覺得在實際測試過程中,這三個技巧還是有幫助的。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

C# 根據BackgroundWorker異步模型和ProgressBar控件,自定義進度條控件_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

前言

程序開發過程中,難免會有的業務邏輯,或者算法之類產生讓人能夠感知的耗時操作,例如循環中對複雜邏輯處理;獲取數據庫百萬乃至千萬級數據;http請求的時候等……
用戶在使用UI操作並不知道程序的內部處理,從而誤操作導致程序無響應,關閉程序等待影響體驗的情況,因此,在等待過程中提供友好的等待提示是有必要的,接下來
我們一起封裝一個自定義進度條控件!

主要使用技術(C#相關)

  • BackgroundWoker異步模型
  • ProgressBar控件
  • 泛型
  • 定時器 System.Timers.Timer

自定義控件開發

項目解決方案

  • BackgroundworkerEx : 自定義進度條控件工程
  • Test : 調用BackgroundworkerEx的工程(只是展示如何調用)

處理控件樣式

  • 新建一個ProgressbarEx名稱的 用戶控件

  • 添加Labal控件(lblTips),用於展示進度條显示的信息狀態

  • 添加一個PictureBox控件(PicStop),充當關閉按鈕,用於獲取用戶點擊事件,觸發關閉/終止進度條

  • 添加進度條ProgressBar控件(MainProgressBar)

  • 處理代碼如下:

  1. 進度條樣式為”不斷循環”,並且速度為50
  2. 該自定義用戶控件不展示在任務欄中
  3. 圖片控件被點擊事件——>設置當前屬性IsStop=true,指示過程終止;
  4. TipMessage屬性,用於設置進度條的信息
  5. SetProgressValue(int value) 設置進度條的Value屬性,使得在ProgressBarStyle.Marquee樣式中動畫平滑
  6. MouseDown/MouseUp/MouseMove這三個事件是用於拖動無邊框的用戶控件(代碼就不貼了)
public ProgressbarEx()
{
    InitializeComponent();

    MainProgressBar.Style = ProgressBarStyle.Marquee;
    MainProgressBar.MarqueeAnimationSpeed = 50;

    this.ShowInTaskbar = false;

    PicStop.Click += (s, eve) =>
    {
    IsStop = true;
    };

    this.MouseDown += CusProgressForm_MouseDown;
    this.MouseUp += CusProgressForm_MouseUp;
    this.MouseMove += CusProgressForm_MouseMove;
}

/// <summary>
/// Need Stop ?
/// </summary>
public bool IsStop { get; private set; } = false;

/// <summary>
/// TipMessage
/// </summary>
public string TipMessage { get; set; }

/// <summary>
/// TipMessage
/// </summary>
public string TipMessage
{
    get
    {
    return lblTips.Text;
    }
    set
    {

    lblTips.Text = value;
    }
}

/// <summary>
/// Set ProgressBar value ,which makes ProgressBar smooth
/// </summary>
/// <param name="value"></param>
public void SetProgressValue(int value)
{
    if (MainProgressBar.Value == 100) MainProgressBar.Value = 0;

    MainProgressBar.Value += value;

}

到現在,這個自定義進度條控件的樣式基本完成了.

功能邏輯處理

運行前所需

  • 定義BackgroundWorkerEx<T>泛型類,並且繼承於 IDisposable
    1. 釋放資源;
 		/// <summary>
        /// Dispose
        /// </summary>
        public void Dispose()
        {
            try
            {
                DoWork = null;
                RunWorkCompleted = null;
                WorkStoped = null;

                _mWorkerThread = null;
                _mWorker.Dispose();
                _mWorker = null;
                _mTimer = null;
            }
            catch (Exception){}
        }
  1. T用與異步處理的時候,傳遞T類型
  • 因為我們是通過.Net 的 BackgroundWorker異步模型來做的,所以我們理所當然定義相關的事件:
    1. 異步開始
    2. 異步完成
    3. 加上我們自定義擴展的異步停止
    4. ……報告進度事件在此進度條樣式中並不需要

我們先定義這四個事件所用到的參數,因為在BackgroundWorkerEx<T>泛型類中,我們還是使用BackgroundWorker來處理異步過程,因此我們定義的參數泛型類需要繼承原來的參數類型,並且在傳輸傳遞中,將原生BackgroundWorkerArgument,Result屬性轉成全局的泛型T,這樣我們在外部調用的時候,拿到的返回結果就是我們傳入到BackgroundWorkerEx<T>泛型類中的T類型,而不需要使用as進行轉換; 注:因為原生沒有停止相關事件,所以自定義異步停止的事件參數使用的是DoWorkEventArgs<T>

    public class DoWorkEventArgs<T> : DoWorkEventArgs
    {
        public new T Argument { get; set; }
        public new T Result { get; set; }
        public DoWorkEventArgs(object argument) : base(argument)
        {
            Argument = (T)argument;
        }
    }


    public class RunWorkerCompletedEventArgs<T> : RunWorkerCompletedEventArgs
    {
        public new T Result { get; set; }
        public RunWorkerCompletedEventArgs(object result, Exception error, bool cancelled) : base(result, error, cancelled)
        {
            Result = (T)result;
        }
    }

接着我們需要去定義事件,參數使用以上定義的泛型類

	public delegate void DoWorkEventHandler(DoWorkEventArgs<T> Argument);
        /// <summary>
        /// StartAsync
        /// </summary>
        public event DoWorkEventHandler DoWork;

        public delegate void StopEventHandler(DoWorkEventArgs<T> Argument);
        /// <summary>
        /// StopAsync
        /// </summary>
        public event StopEventHandler WorkStoped;

        public delegate void RunWorkCompletedEventHandler(RunWorkerCompletedEventArgs<T> Argument);
        /// <summary>
        /// FinishAsync
        /// </summary>
        public event RunWorkCompletedEventHandler RunWorkCompleted;
  • 定義全局的字段
    1. private BackgroundWorker _mWorker = null;異步操作必要;
    2. private T _mWorkArg = default(T);操作傳遞進來的參數類並且返回到外部
    3. private Timer _mTimer; 定時器檢測自定義進度條控件屬性IsStop是否為true,並且動態修改進度條消息
    4. private Thread _mWorkerThread = null;異步操作在該線程中,終止時調用About()拋出ThreadAbortException異常,用於標記當前是停止而不是完成狀態
    5. private int _miWorkerStartDateSecond = 0; 異步消耗時間(非必要)
    6. private int _miShowProgressCount = 0; 動態显示”.”的個數(非必要)
    7. private ProgressbarEx _mfrmProgressForm = null; 自定義進度條控件實例
        /// <summary>
        /// .Net  BackgroundWorker
        /// </summary>
        private BackgroundWorker _mWorker = null;

        /// <summary>
        /// Whole Para
        /// </summary>
        private T _mWorkArg = default(T);

        /// <summary>
        /// Timer
        /// </summary>
        private Timer _mTimer = null;

        /// <summary>
        /// WorkingThread
        /// </summary>
        private Thread _mWorkerThread = null;

        /// <summary>
        /// Async time sec
        /// </summary>
        private int _miWorkerStartDateSecond = 0;

        /// <summary>
        /// Async time dot
        /// </summary>
        private int _miShowProgressCount = 0;

        /// <summary>
        /// ProgressbarEx
        /// </summary
        private ProgressbarEx _mfrmProgressForm = null;

  • 定義全局屬性
  1. IsBusy 返回_mWorker的工作忙碌是否
  2. ProgressTip 自定義進度條控件显示內容
	/// <summary>
        /// Express Busy
        /// </summary>
        public bool IsBusy
        {
            get
            {
                if (_mWorker != null)
                {
                    return _mWorker.IsBusy;
                }
                return false;
            }
        }

        /// <summary>
        /// 進度條提示 默認: 正在加載數據,請稍後[{0}]{1}
        /// </summary>
        public string ProgressTip { get; set; } = "Elapsed Time[{0}]{1}";

**到現在,我們已經將必要的字段,屬性,樣式都處理完成!!! ** 接下來我們就要實現方法

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

方法實現

  • 異步工作事件,用法與BackgroundWorker一致,

    1. 如果調用處沒有註冊DoWork事件,則直接返回

    2. 將接受到的參數創建成泛型參數類

    3. 開線程,將異步操作放在該線程中操作,注意設置線程的IsBackground=true,防止主進程意外退出,線程還在處理

    4. 循環直到線程結束

    5. e.Result = Argument.Result;將結果賦予Result,在停止或者完成事件中可以獲取到結果

		/// <summary>
        /// Working
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            if (DoWork == null)
            {
                e.Cancel = true;
                return;
            }

            DoWorkEventArgs<T> Argument = new DoWorkEventArgs<T>(e.Argument);

            try
            {
                if (_mWorkerThread != null && _mWorkerThread.IsAlive)
                {
                    _mWorkerThread.Abort();
                }
            }
            catch (Exception)
            {
                Thread.Sleep(50);
            }

            _mWorkerThread = new Thread(a =>
            {
                try
                {
                    DoWork?.Invoke(a as DoWorkEventArgs<T>);
                }
                catch (Exception)
                {

                }
            });

            _mWorkerThread.IsBackground = true;
            _mWorkerThread.Start(Argument);

            //Maybe cpu do not start thread
            Thread.Sleep(20);

            //Wait.....
            while (_mWorkerThread.IsAlive)
            {
                Thread.Sleep(50);
            }
            e.Result = Argument.Result;
        }
  • 異步完成/停止

    當線程停止拋出異常(catch但是不處理)/線程完成時會進入異步完成事件

    1. 完成后,將自定義進度條控件實例關閉,釋放
  1. 將全局的BackgroundWorker實例_mWorker相關事件取消註冊,並且檢查線程情況
  2. 感覺線程情況,如果線程狀態為ThreadState.Aborted意味着線程被停止了,調用停止事件,否則調用完成事件
	  /// <summary>
      /// Completed
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void Worker_RunWorkCompleted(object sender, RunWorkerCompletedEventArgs e)
      {
          try
          {
              if (_mfrmProgressForm != null)
              {
                _mfrmProgressForm.Close();
                  _mfrmProgressForm.Dispose();
                _mfrmProgressForm = null;
              }

                if (_mWorker != null)
                {
                    _mWorker.DoWork -= Worker_DoWork;
                    _mWorker.RunWorkerCompleted -= Worker_RunWorkCompleted;

                    try
                    {
                        if (_mWorkerThread != null && _mWorkerThread.IsAlive) _mWorkerThread.Abort();
                    }
                    catch (Exception) { }
                }

              //In timer, When stop progress will make thread throw AbortException
              if (_mWorkerThread != null && _mWorkerThread.ThreadState == ThreadState.Aborted)
            {
                  WorkStoped?.Invoke(new DoWorkEventArgs<T>(_mWorkArg));
              }
              else
              {
                  RunWorkCompleted?.Invoke(new RunWorkerCompletedEventArgs<T>(e.Result, e.Error, e.Cancelled));
              }
          }
          catch (Exception ex)
          {
              throw ex;
          }
      }
  • 線程開始

    1. 檢查消息提醒內容 , {0}{1}同於显示異步耗時和”..”的個數
    2. 在定時器執行方法中,檢查_mfrmProgressForm.IsStop是否為true,這個屬性標誌是否被停止;true則拋出異常
    3. _mfrmProgressForm不為Null則不斷修改當前的內容提醒,友好化,實際可以按需處理
    		  /// <summary>
            /// Timer Start 
            /// </summary>
            private void StartTimer()
            {
                //Check user ProgressTip
                if (!ProgressTip.Contains("{0}"))
                {
                    ProgressTip += "...Elapsed Time{0}{1}";
                }
    
                if (_mTimer != null) return;
    
                //On one sec 
                _mTimer = new Timer(1000);
                _mTimer.Elapsed += (s, e) =>
                {
                    //progress and it's stop flag (picture stop)||  this stop flag
                    if (_mfrmProgressForm != null && _mfrmProgressForm.IsStop)
                    {
                        if (_mWorker != null)
                        {
                            try
                            {
                                if (_mWorkerThread != null && _mWorkerThread.IsAlive)
                                {
                                    if (_mTimer != null && _mTimer.Enabled)
                                    {
                                        _mTimer.Stop();
                                        _mTimer = null;
                                    }
                                    _mWorkerThread.Abort();
                                }
                            }
                            catch (Exception) { }
                        }
                    }
    
                    if (_mfrmProgressForm != null)
                    {
                        //Callback 
                        _mfrmProgressForm.Invoke(new Action<DateTime>(elapsedtime =>
                        {
                            DateTime sTime = elapsedtime;
    
                            //worked time
                            _miWorkerStartDateSecond++;
                            if (_mfrmProgressForm != null)
                            {
                                _mfrmProgressForm.SetProgressValue(_miWorkerStartDateSecond);
                            }
    
                            //.....count
                            _miShowProgressCount++;
    
                            if (_miShowProgressCount > 6)
                            {
                                _miShowProgressCount = 1;
                            }
    
                            string[] strs = new string[_miShowProgressCount];
    
                            string ProgressStr = string.Join(".", strs);
    
                            string ProgressText = string.Format(ProgressTip, _miWorkerStartDateSecond, ProgressStr);
    
                            if (_mfrmProgressForm != null)
                            {
                                _mfrmProgressForm.TipMessage = ProgressText;
                            }
                        }), e.SignalTime);
                    }
                };
    
                if (!_mTimer.Enabled)
                {
                    _mTimer.Start();
                }
            }
    
  • 最後一步:異步開始BackgroundWorker用法一致,只是在最後開始了定時器和進度條控件而已

    /// <summary>
            /// Start AsyncWorl
            /// </summary>
            /// <param name="Para"></param>
            public void AsyncStart(T Para)
            {
                //if workeven is  null ,express user do not regist event
                if (DoWork == null)
                {
                    return;
                }
    
                _miWorkerStartDateSecond = 0;
                _miShowProgressCount = 0;
    
                //init
                if (_mWorker != null && _mWorker.IsBusy)
                {
                    _mWorker.CancelAsync();
                    _mWorker = null;
                }
    
                _mWorker = new BackgroundWorker();
    
                //create progressbar
                _mfrmProgressForm = new ProgressbarEx();
    
                //add event
                _mWorker.DoWork += Worker_DoWork;
                _mWorker.RunWorkerCompleted += Worker_RunWorkCompleted;
    
                _mWorker.WorkerReportsProgress = true;
                _mWorker.WorkerSupportsCancellation = true;
    
                //Set Whole Para
                _mWorkArg = Para;
    
                _mWorker.RunWorkerAsync(Para);
                //Start timer
                StartTimer();
    
                _mfrmProgressForm.StartPosition = FormStartPosition.CenterParent;
                _mfrmProgressForm.ShowDialog();
            }
    

到這裏,整個的進度條控件已經完成了!

調用

  • 定義一個參數類
	/// <summary>
    /// Para Class
    /// </summary>
    public class ParaArg
    {
        public DataTable Data { get; set; }
        public string Msg { get; set; }
        public Exception Ex { get; set; }
    }
  • 定義全局的幫助類BackgroundWorkerEx<ParaArg> workHelper = null;
  • 調用
				if (workHelper != null || (workHelper != null && workHelper.IsBusy))
                {
                    workHelper.Dispose();
                    workHelper = null;
                }
                if (workHelper == null)
                {
                    workHelper = new BackgroundWorkerEx<ParaArg>();
                }

                workHelper.DoWork += (eve) =>
                {
                    ParaArg args = eve.Argument;

                    try
                    { 
                        //ToDo  like Thread.Sleep(20000);
                        Thread.Sleep(10000);
                        args.Msg = "...this is bussiness code result";
                        throw new Exception("");
                    }
                    catch (Exception ex)
                    {
                        args.Ex = ex;
                    }
                    finally
                    {
                        eve.Result = args;
                    }

                };
                workHelper.RunWorkCompleted += (eve) =>
                {
                    if (eve.Error != null)
                    {
                        //get .net backgroundworker exception;
                        //handle this exception;
                        //return ?
                    }

                    //get your para result
                    ParaArg x = eve.Result;
                 
                    if (x.Ex != null)
                    {
                        //get your bussiness exception;
                        //handle this exception;
                        //return ?
                    }

                    //finially get your need;
                    //MayBe to do some UI hanlde and bussiness logical
                    string sReusltMsg = x.Msg;
                };

                workHelper.WorkStoped += (eve) =>
                { 
                    //if stoped ! it means no error;
                    //just get what you want; 
                    ParaArg x = eve.Result as ParaArg;

                    btnBegin.Enabled = true;
                };

                //參數
                ParaArg arg = new ParaArg()
                {
                    Msg = "Msg"
                };

                workHelper.AsyncStart(arg);

最後

其實不管是封裝的過程,還是調用,可以說完全就是BackgroundWorker的方式,所以很多BackgroundWorker相關的地方我都沒有很詳細的去說明;只要看看這個異步模型,就能夠很好理解!大家有空也可以實現以下,有問題也可以詳細,我比較喜歡交流技術~~~

還有一點就是這個解決方案已經放上Github上了,歡迎大家拉下來用

  • GitHub地址 歡迎star/fork

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

軸距2.7米排量2.0L 最便宜的專車回本神器僅8萬起?_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

89萬軸距:2805mm雖然帝豪EC8的表現不那麼讓人滿意,但是EC8在上市之初還是讓人驚訝了一把,吉利的造車水準越來越好,在EC8那一時期就有所體現,EC8定位中級車,敦實霸氣的外觀甚至有幾分奧迪A8的感覺。2805mm的軸距也是標準的中級車水準。

比亞迪G6

指導價:7.98-11.58萬

軸距:2745mm

比亞迪G6是比亞迪旗下的一款中級轎車,比亞迪作為價格屠夫旗下的車型一直都是十分有性價比的,G6也是很有性價比的一款中級轎車,7.98-11.58萬的售價只有合資中級車的一半左右,但是搭載的2.0L發動機以及各種配置一點都不弱,4860*1825*1463mm的車身尺寸也比較大,視覺效果不錯。

有着龐大的尺寸的比亞迪G6在內部空間上也比較優秀,尤其是後排橫向空間十分寬敞,G6的內飾設計沒有什麼特色,整體屬於比較中規中矩的設計風格,但是儀錶盤設計還是很有比亞迪的特色的。內飾的用料和做工也達到中級車的水準。

納智捷-納5

指導價:8.58-11.98萬

軸距:2720mm

納智捷-納5屬於大緊湊型轎車,全系搭載1.8T發動機,並且軸距也超過了2720mm,但是售價只需要8.58萬起,對於想要購買軸距2700mm以上的,發動機1.8T以上或者2.0L的消費者來說,這款車型也是比較划算的。

納智捷-納5的內飾也是屬於比較有新意的,尤其是儀錶盤的設計,很有科技感,但是閱讀起來需要一定的時間適應,內飾的用料和做工也都不錯。

吉利汽車-吉利EC8

指導價:8.89-11.89萬

軸距:2805mm

雖然帝豪EC8的表現不那麼讓人滿意,但是EC8在上市之初還是讓人驚訝了一把,吉利的造車水準越來越好,在EC8那一時期就有所體現,EC8定位中級車,敦實霸氣的外觀甚至有幾分奧迪A8的感覺。2805mm的軸距也是標準的中級車水準。

EC8的內飾也屬於比較方正的設計,

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

整體內飾十分的好用,但是在內飾造型設計上顯得有點古板了,儀錶盤的樣式也有些過時,不過考慮到這麼大的車這樣的價位,夫復何求呢?

一汽奔騰-奔騰B70

指導價:9.98-14.98萬

軸距:2725mm

奔騰B70的外觀有幾分馬自達的感覺,當然B70本身在底盤等部分也和馬自達有着一定的關係,因此B70的底盤表現比較讓人滿意,作為一台中級車,B70也有着不錯的尺寸,只是2725mm的軸距在中級車中實在拿不出手了。

內飾上B70倒是很有自己的設計,尤其是中控台的造型相當的別緻,在內飾的做工上B70也十分的規整,做工值得表揚,有着大廠風範,儀錶設計比較簡約,但是閱讀起來十分的方便,信息显示也很豐富,頗有幾分日系車的設計思路。

眾泰Z700

指導價:9.98-15.88萬

軸距:3000mm

軸距3000mm的眾泰Z700是一台不折不扣的中大型轎車,雖然尺寸大但是售價仍然十分親民,9.98萬的起售價許多人都可以買得起,但是眾泰的質量一直受人詬病,這款Z700屬於上市不久的新車,質量表現就有待市場檢驗了。

Z700最有爭議的就在內飾設計上,Z700幾乎是原封不動的移植了奧迪A6L的設計,甚至連MMI系統都模仿了,不過對於中大型車來說,尤其是自主車型來說,這樣的設計方法也是最簡單粗暴的。Z700整個內飾可以說豪華和山寨感充斥着,也別有一番風味。

誰說2.0L/1.8T+2700mm以上軸距的車型就很貴呢?其實7.98萬起就能夠買到嘛,自主車總是能夠給我們帶來那麼多充滿驚喜的高性價比產品,這裏衷心地為我們的自主品牌迪鼓個掌,你們說是不是呢?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。