Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Windows Phone のバックグラウンドタスクのサンプル。
#define DEBUG_AGENT
using System.Diagnostics;
using System.Windows;
using Microsoft.Phone.Scheduler;
using Microsoft.Phone.Shell;
using Chatwork.Service.Shared;
using System;
using System.Linq;
namespace Chatwork.Service.WP.ScheduleAgent
{
public class ScheduledAgent : ScheduledTaskAgent
{
/// <remarks>
/// ScheduledAgent コンストラクターは、UnhandledException ハンドラーを初期化します
/// </remarks>
static ScheduledAgent()
{
// マネージ例外ハンドラーをサブスクライブします
Deployment.Current.Dispatcher.BeginInvoke(delegate
{
Application.Current.UnhandledException += UnhandledException;
});
}
/// ハンドルされない例外の発生時に実行されるコード
private static void UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (Debugger.IsAttached)
{
// ハンドルされない例外が発生しました。デバッガーで中断します。
Debugger.Break();
}
}
/// <summary>
/// スケジュールされたタスクを実行するエージェント
/// </summary>
/// <param name="task">
/// 呼び出されたタスク
/// </param>
/// <remarks>
/// このメソッドは、定期的なタスクまたはリソースを集中的に使用するタスクの呼び出し時に呼び出されます
/// </remarks>
protected override void OnInvoke(ScheduledTask task)
{
if (task is PeriodicTask)
{
var status = MutexedIsoStorageFile.Read();
var client = new ChatworkClient(status.Token);
var myStatus = client.My.GetStatusAsync().Result;
if (myStatus.unread_num > status.Unread ||
myStatus.mention_num > status.Mention ||
myStatus.mytask_num > status.MyTask)
{
status.Unread = myStatus.unread_num;
status.Mention = myStatus.mention_num;
status.MyTask = myStatus.mytask_num;
MutexedIsoStorageFile.Write(status);
var toast = new ShellToast()
{
Title = "Background Agent",
Content = "新着通知があります",
NavigationUri = new Uri("/MainPage.xaml", UriKind.Relative)
};
toast.Show();
}
else
{
//テスト用の通知メッセージ
#if DEBUG_AGENT
var toast = new ShellToast()
{
Title = "Background Agent",
Content = "更新はありませんでした",
NavigationUri = new Uri("/MainPage.xaml", UriKind.Relative)
};
toast.Show();
#endif
}
var tile = ShellTile.ActiveTiles.FirstOrDefault();
if (tile != null)
{
var newTileData = new StandardTileData
{
Count = myStatus.mytask_num
};
tile.Update(newTileData);
}
}
else
{
//ファイル送信などのためのタスクはこちらに記述
}
// デバッグ用に1分後に起動
#if DEBUG_AGENT
ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60));
#endif
NotifyComplete();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment