4

バックグラウンド スレッドで 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 スレッドで実行されませんでした。

4

1 に答える 1

3

Task.Factory.StartNew()それ自体は新しいスレッドを開始しません。代わりに、現在のメソッド呼び出しを処理している間、ブロックされることなくメソッド エントリ ポイントを再度呼び出すことができます。内部でこれがどのように行われるかは少し複雑ですが、それを使用することは「新しいスレッドを開始してこのコードを実行する」アプローチではありません。その上、呼び出しスレッドで終了する前に CPU がスレッド内でコードを実行することを決定しない理由はありません。それはスレッドスケジューラ次第です。

于 2013-02-20T16:21:01.887 に答える