2012年3月16日 星期五

以 Mutex 管理 App 與 BackgroundAgent

Windows Phone 7.1 SDK 以後提供了幾個非常難用的類別…
就先統一稱作 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();
}

沒有留言:

張貼留言