バックグラウンド スレッドで Web リクエストを実行してから、コールバックを UI スレッドで処理する必要があります。これが私のコードです:
Task.Factory.StartNew(() =>
{
Console.Out.WriteLine("Start the request");
return request.GetResponse();
}
).ContinueWith(t =>
{
Console.Out.WriteLine("Response");
using (HttpWebResponse response = (HttpWebResponse)t.Result)
{
string responseBody = ...
}
},
TaskScheduler.FromCurrentSynchronizationContext());
Console.Out.WriteLine("Continue with normal UI code");
}
何が起こるべきか:
"Start the request"
"Continue with normal UI code"
.
.
.
"Response"
しかし、私は得る:
"Start the request"
.
.
.
"Response"
"Continue with normal UI code"
request.GetResponse()
StartNew とは無関係にスレッド全体を停止するようなものです。何か案は?MonoDevelop (Mono for Android) を使用しています。
編集:Mono for Androidのドキュメントによると
「Parallel Task Library で作成されたタスクは、非同期で実行して呼び出し元のスレッドに戻ることができるため、ユーザー インターフェイスをブロックすることなく長時間実行される操作をトリガーするのに非常に役立ちます。
単純な並列タスク操作は次のようになります:"
using System.Threading.Tasks;
void MainThreadMethod ()
{
Task.Factory.StartNew (() => wc.DownloadString ("http://...")).ContinueWith (
t => label.Text = t.Result, TaskScheduler.FromCurrentSynchronizationContext()
);
}
だから私の解決策はうまくいくはずです!
誰かがバックグラウンド コール + UI スレッド コールバックを行うより良い方法を持っている場合、私は提案を受け付けています。BeginGetResponse / EndGetResponse を試しましたが、コールバックは UI スレッドで実行されませんでした。