我對wp7開發並不陌生,目前正在開發一個應用程序,該應用程序具有後臺代理以根據從Web調用到api的響應更新值。如何在後臺代理中進行同步Web呼叫
我的問題是,對Web調用的響應是異步調用,我無法訪問從後臺代理返回的結果。
有沒有什麼辦法可以在後臺代理中進行同步調用,以便我可以在同一個代理中處理結果?
我已經嘗試處理共享庫中類中的Web調用,但異步調用僅在代理的onInvoke方法完成後纔會生成,因此無用。任何想法都會很棒。
我對wp7開發並不陌生,目前正在開發一個應用程序,該應用程序具有後臺代理以根據從Web調用到api的響應更新值。如何在後臺代理中進行同步Web呼叫
我的問題是,對Web調用的響應是異步調用,我無法訪問從後臺代理返回的結果。
有沒有什麼辦法可以在後臺代理中進行同步調用,以便我可以在同一個代理中處理結果?
我已經嘗試處理共享庫中類中的Web調用,但異步調用僅在代理的onInvoke方法完成後纔會生成,因此無用。任何想法都會很棒。
您只需在異步調用的完成處理程序中調用NotifyComplete()方法,而不是之前。在調用結束時刪除調用。
你可以使用像這樣的的AutoResetEvent:
protected override void OnInvoke(ScheduledTask task)
{
AutoResetEvent are = new AutoResetEvent(false);
//your asynchronous call, for example:
WebClient wc = new WebClient();
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
wc.OpenReadAsync(searchUri, channel);
// lock the thread until web call is completed
are.WaitOne();
//finally call the NotifyComplete method to end the background agent
NotifyComplete();
}
和您的回調方法應該是這樣的:
void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
//do stuff with the web call response
//signals locked thread that can now proceed
are.Set();
}
記住,你應該檢查一下連接可用並處理可能的例外,如果你的後臺代理會連續被殺兩次(由於內存消耗或持續時間),它將被操作系統禁用。