GetResponse在Task.Factory.StartNew中运行

时间:2013-02-20 16:06:41

标签: c# .net mono xamarin.android

我想在后台线程中运行webrequest,然后在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 documentation

  

"使用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线程上运行。

1 个答案:

答案 0 :(得分:3)

Task.Factory.StartNew()本身不会启动新的线程,而是允许再次调用方法入口点,而不会在它处理当前方法调用时被阻塞。如何在引擎盖下发生这种情况有点复杂,但使用它并不是“启动新线程并运行此代码”方法。最重要的是,没有理由为什么cpu在退出调用线程之前不会决定在Thread内运行代码。这取决于线程调度程序。