Silverlight 2 β2 で、WebHttpRequest や WebClient が、本当に非同期通信になりました。
うん。なんかね、「非同期通信にしか対応していないよ」と書いてあったのに、Silverlight 上ではスレッドが1つしかなかったのね。それが、UI Thread と、Communication Thread に分かれたの。
はい、何が起こるかわかるよね。Communication Thread で UI Elements を操作しようとすると、例外が発生しますorz...
それと、Uri 型だった WebClient.BaseAddress が、ただの文字列になりましたorz...
そんなわけで、第3回と、第4回のコードを書き直し。
まず、SyncronizationContect を用意します。その名の通り、同期するためのコンテキストです。こいつに、UI Thread を参照させます。そして、通信を受け取った後、UI Thread で通信の内容を転写します。
元ネタは、開発者さんのブログ。
では、書き直したコード。
// 同期コンテキスト
SynchronizationContext syncContext;
public Page() {
InitializeComponent();
this.Loaded += new RoutedEventHandler(Page_Loaded);
}
void Page_Loaded(object sender, RoutedEventArgs e) {
// 現在のコンテキストを参照させておく
syncContext = SynchronizationContext.Current;
WebClient client = new WebClient();
// ただの文字列なので、Uri に変換
Uri assmblUri = new Uri(client.BaseAddress);
// β1ではパスだったのに、.xap に変わっているので、パスに変換
string path = System.IO.Path.GetDirectoryName(assmblUri.LocalPath).Replace('\\', '/');
// スキーマやホストをつなげて URI にできる文字列にする
string uri = String.Format("{0}://{1}{2}/warnigLog.xml"
, assmblUri.Scheme, assmblUri.Host, path, assmblUri.AbsolutePath);
textBox1.Text = uri;
Uri logUri = new Uri(uri);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(logUri);
request.BeginGetResponse(new AsyncCallback(GetWarningLog), request);
}
private void GetWarningLog(IAsyncResult result) {
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
// 同期コンテキストから呼び出す
syncContext.Post(SynchronizedResponse, response);
}
private void SynchronizedResponse(object state) {
HttpWebResponse response = state as HttpWebResponse;
Stream stream = response.GetResponseStream();
try {
XmlSerializer serializer = new XmlSerializer(typeof(WarningLog));
log = (WarningLog)serializer.Deserialize(stream);
textBox1.Text += ":resieved\n";
foreach (Warning w in log.WarningList) {
textBox1.Text += (w.ToString() + "\n");
}
} catch (Exception ex) {
textBox1.Text = ex.ToString();
}
}
ニュース ソース その1
秋葉原殺傷:書き込み検知技術開発へ 総務省が予算要求
(毎日新聞)より:
総務省は東京・秋葉原の17人殺傷事件を受け、携帯電話やパソコンの掲示板に書き込まれた殺人予告などを自動的に検知し、警察へ110番通報する技術開発に乗り出す。
新技術をプロバイダーが導入すると(1)ブログや掲示板に30分ごとに接続(2)自殺、学校襲撃などの危険語を検知(3)危険語の前後の文脈を分析、犯行予告かを判定(4)書き込み削除、警察へ通報--の流れで犯行防止を図ることができるという。09年度予算の概算要求に盛り込み、11年度までの完成と早期の実用化を目指す。
ニュース ソース その2
犯罪予告の書き込みを集約して事件を防止--ロケスタの新サービス「予告.in」(CNET Japan)より:
ウェブ上に書き込まれた犯罪予告を共有することで、犯罪の防止を目指すサービス「予告.in」をロケットスタートが発表した。
予告.inははてなのタグや2ちゃんねるのスレッド、ブログの記事などから「殺人」「爆破」「犯行予告」といった事件性の高いキーワードを含むものを定期的に取得し、一覧で表示する。
総務大臣の増田寛也氏がネット上の犯罪予告を検知するソフトウェアの開発費を、来年度予算に盛り込む方針であるとコメントしたことにふれた上で、TwitterやYahoo!のAPIなどを利用して約2時間でサービスを作成したとコメントしている。
他のニュースを見たときには、「0億円で」と書かれていた。「0円」ではなく、「0億円」ですよ、「0億円」。