就先統一稱作 BackgroundAgent 吧…
BackgroundAgent
這幾個類別提供了開發者讓你的 App 可以在背景時做一些事情的方法…
但限制不少…以 ScheduledTaskAgent 為例…大約每 30 分鐘啟動一次…
啟動後每次可執行 30 秒…大約 30 分鐘是什麼…只能執行 30 秒又是怎麼回事 *-*
種種的限制會讓程式非常的難寫…好吧…難寫不代表做不到…所以還是得寫…
在多項限制下最今我感到不方便的是這些 Agent 和 App 之中並沒有任何的 IPC
兩者之間交換資訊或委托做事…全部只能透過檔案存取資訊與週期性檢查檔案的方式來達成…
連 IsolatedStorageSetting 也不能共用…寫起來相當的要人命…
因為 Agent、App 是不同的 Process 所以在交換資訊方面很有可能發生搶資源的情況…
若 Agent 正在讀寫某個檔案時…App 也對該檔案做讀寫…
可能造成資料不一致甚至 IOException 的情況…
這時可以善用 Mutex 來解決這種狀況…
MSDN - Mutex
Mutex 的建構式中其中幾項可以下 String name 的參數…
這可以讓你以這個 name 來建立及調用 Mutex…更棒的一點是它是跨 Process 的…
所以利用 Mutex 的 WaitOne() 及 ReleaseMutex() 兩個 Method
即可以達到在 App、Agent 間控管資源的作用…
例如 App 及 Agent 都透過 ShareInformation.xml 交換資訊…
就可以分別在 App 及 Agent 中各建立這種類型的 class 或 method 簡單的範例如下…
//在 App、Agent 中各建立一個 Mutex
public Mutex _Mutex = null;
在 App 或 Agent 的建構式初始化 Mutex 並給相同的 name
{
_Mutex = new Mutex(false, "AsciiAppAgentMutex");
}
public String LoadShareInformation()
{
_Mutex.WaitOne();
// 對 ShareInformation.xml 做讀取的動作
_Mutex.ReleaseMutex();
}
public void StoreShareInformation(String strXMLData)
{
_Mutex.WaitOne();
// 對 ShareInformation.xml 做寫入的動作
_Mutex.ReleaseMutex();
}
沒有留言:
張貼留言