【问题标题】:GetResponse running in Task.Factory.StartNew在 Task.Factory.StartNew 中运行的 GetResponse
【发布时间】:2013-02-21 03:03:50
【问题描述】:

我希望在后台线程中运行 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(Android 的 Mono)。

编辑:根据Mono for Android documentation

"使用并行任务库创建的任务可以异步运行 并返回他们的调用线程,使他们非常有用 在不阻塞用户的情况下触发长时间运行的操作 界面。

一个简单的并行任务操作可能如下所示:"

using System.Threading.Tasks;
void MainThreadMethod ()
{
    Task.Factory.StartNew (() => wc.DownloadString ("http://...")).ContinueWith (
        t => label.Text = t.Result, TaskScheduler.FromCurrentSynchronizationContext()
    );
}

所以我的解决方案应该有效!

如果有人有更好的方法来进行后台调用 + UI-thread-callback,我愿意接受建议。尝试了 BeginGetResponse / EndGetResponse 但回调不在 UI 线程上运行。

【问题讨论】:

标签: c# .net mono xamarin.android


【解决方案1】:

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

【讨论】:

  • 根据docs.xamarin.com/guides/cross-platform/application_fundamentals/…“使用并行任务库创建的任务可以异步运行并返回其调用线程,这使得它们对于触发长时间运行的操作而不会阻塞用户界面非常有用”
  • @Sunkas 关键字是 can,而不是 will。不过,您确实应该使用异步方法来获取响应,而不是使用同步方法并尝试将其置于后台线程中。
  • @Sunkas 是的,可以运行。见byterot.blogspot.ie/2012/04/…。它说“这并不一定意味着 Task 将在后台线程或 ThreadPool 中运行。”。
  • 好的,谢谢!有一个异步解决方案,但我得到的回调是在后台线程上运行的。有关如何使其在 UI 线程上运行以能够更新 UI 的任何线索?
  • @Sunkas 尝试以下操作:stackoverflow.com/questions/661561/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多