http://www.silverlightchina.net/html/zhuantixilie/winphone7/2012/0301/14170.htmlhtml
http://www.cnblogs.com/webabcd/archive/2012/07/16/2592989.html web
有一種坑(限制),叫人內心憔悴~~~app
請注意看清楚限制。。less
學了一陣子關於Background Agent的運用後,感受WP7在Background上的處理,讓開發人員學習很是容易,但有些觀念可能須要本身多花點時間來看,以避免在送審程式時花了很多的時間成本。ide
今天要介紹的是Background File Transfer,這是WP7.1 SDK提供的另外一個Backgrund Agent,適合使用的情境可想而知:運用於傳輸大量檔案、背景與Server端交換資訊等。所以,往下將針對重點部分一一說明:學習
〉Microsoft.Phone.BackgroundTransfer:spa
WP7.1 SDK提供應用程式佇列一至多個檔案進行上傳/下載,而且讓任務可在背景環境下繼續執行,甚至是該應用程式已長時間不在前景執行,另外該API也提供擷取、查詢目前file transfer運行的狀態,讓end user能夠了解目前的存取狀態。這些功能在Microsoft.Phone.BackgroundTransfer裡都能找到,接着往下介紹二個重要元件:.net
A. BackgroundTransferRequest與BackgroundTransferService:orm
A-1. BackgroundTransferRequest:htm
該物件表明一個transfer request,其內容包括:目標、檔案路徑、傳輸方法與如今的傳輸狀態。
另外,當transfer request下載完成觸發completed事件時,記得唿叫background transfer service將這個transfer request進行remove,由於系統必不會自動把它移去。
重點屬性說明:
Name | Description |
DownloadLocation | 取得/設定request檔案下載後要儲存的local path。可搭配建構子一塊兒設定。 |
Headers | 取得request的HTTP headers集合(Dictionary)。 |
Method | 取得/設定request使用的HTTP Method。 |
TransferPreferences | 取得/設定何種條件下transfer能夠被使用,屬於列舉值:TransferPreferences Enumeration。可參考[補充]的說明。 |
TransferStatus | 取得transfer的狀態。可配合BytesReceived與BytesSent擷取進度時使用。 |
TransferError | 若是transfer執行了completed,TransferError一般是null。相反的,不爲null則表明有錯誤發生。 |
另外,二個重要的事件:TransferProgressChanged與TransferStatusChanged留到範例來講明。
A-2. BackgroundTransferService:
該物件用於初始化一個新的transfer、查詢或管理已存在的file transfers。其任務爲控制全部的transfer物件,然而,BackgroundTransferRequest.Method僅支援HTTP與HTTPS,尚不支援FTP的協定,因此目前能夠透過GET/POST上傳或下載檔案。
重點屬性說明:
Name | Description |
Requests | 取得向BackgroundTransferServicec中全部啓動的transfer requests。其角色與ScheduledActionService中的GetActions很類似。 |
Add | 增長background transfer request至佇列中。 |
Find | 透過指定的ID(RequestId)去企圖取回特定的background transfer reqeust。 |
Remove | 透過指定的ID(RequestId)去企圖移除特定的background transfer reqeust。 |
瞭解了BackgroundTransferService的角色以後,要特別注意的是:
a-2-1. 每個應用程式只能有5個request在給定的時間內。
a-2.2. 企圖增長超過5個request時,系統會自動發出Exception。
a-2-3. 若是要移除佇列中的request,請透過Remove的方法,該方法移除成功後會觸發Completed的事件。
C. Background Transfer Policies (Background Transfer基本守則):
C-1. File System Restrictions(檔案路徑使用條件):
全部的background trasnfers都須要有一個 local file path(實際本機路徑)。下載檔案須要指定要儲存的實際位置;
上傳檔案需指定要從那一個實際位置將檔案上傳,所以,全部的background tansfers使用的檔案路徑,必須存在於isolated storage的固定路徑:「/shared/transfers」之中,該資料表是在程式被安裝至設備後,自動產生出來的,若是本身手動刪除或改名了,必須再重建一個相同名稱的資料夾,才能初始化全部的transfers物件。
另外,可在/shared/transfers資料夾下建構須要檔案結構,這是合法的,但若是使用transfers時使用的是非特定的路徑,那transfer將沒法被初始化則會出現exception。
C-2. Sizes(檔案大小):
最大上傳檔案大小 | 5 MB |
在行動網路,最大下載檔案大小 | 20 MB 若是檔案超過限制,TransferPreferences屬性會自動轉變成AllowBattery,這將變成要求於Wi-Fi環境下才能進行傳輸。 |
在Wi-Fi,沒有外接電源,最大下載檔案大小 | 100 MB 若是檔案超過100 MB,需設定TransferPreferences屬性爲"None",不然傳輸會失敗。若是應用時不肯定傳輸檔案的大小時,建議設定成None能夠確保傳輸程序不會被拒絕。 |
C-3. Limits(限制):
每一個應用程序的最大未完成請求佇列量。(包括:active與pending的請求) | 5 因爲傳輸完成後,傳輸請求並不會被自動移除,須要透過Remove(BackgroundTransferRequest)去除存在佇列中已完成的項目。 |
設備上跨全部應用程序的目前最大傳輸程序 | 2 當前最多隻有二個Background File Transfer在運做。 |
設備上跨全部應用程序的最大佇列傳輸程序 (Maximum queued transfers across all applications on the device) |
500 |
每一個Requeset的HTTP headers最大數量 | 15 |
HTTP headers的最大容量 | 16 KB each |
另外,在使用HTTP headers時,有幾個保留字是不可使用於BackgroundTransferRequest,以下:
「If-Modified-Since」、「If-None-Match」、「If-Range」、「Range」與「Unless-Modified-Since」。
C-4. Policies(守則):
background file transfer不支援在「non-simultaneous voice」與「2G, EDGE, Standard GPRS」環境使用。
=>所以,background file transfer只支援在Wi-Fi、3G(或更快速)的網路環境。
當檔案大小超過5 MB時,HTTP headers中的「content-length」與「range」 是必要存在的。Server端應該
永遠在response中回傳content-length的值。若是不這樣作,可能會形成嚴重的傳輸效能煺化。
C-5. Slow Transfer(較慢的速度):
若是網路的速度低於下列的速度,傳輸任務會被paused(暫停)與retried(從新連線):
=> 3G (50 kbps);Wi-Fi(100 kbps)
〉範例說明:
該範例爲撰寫一個透過手機下載圖示至本機IIS裡。看起來很是容易吧,由於在前年我已經有寫過一個下載檔案的程式範例:,當時是使用WebClient實做Download的功能,但它只能在程式執行時使用,今天範例則是要讓它也能在背景執行。
a. 程式啓動後,先檢查「/shared/transfers」是否存在;